2012-11-06 4 views

Antwort

16

Die Verwendung von for update nowait führt dazu, dass die Zeilen belegt sind und eine Sperre eingeht, bis eine Festschreibung oder ein Rollback ausgeführt wird. Jede andere Sitzung, die versucht, eine Sperre zu erhalten, wird eine Oracle-Fehlermeldung wie ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired instead of waiting the lock to release erhalten.

Session1:

CURSOR abc_cur 
IS 
select * from dept where deptno =10 for update nowait; 

Hier werden die Zeilen gesperrt sind, bis der Cursor geschlossen oder ein Commit/Rollback ausgeführt wird. Wenn inzwischen Sitzung ein anderer Benutzer von 2 die gleichen Datensätze zuzugreifen versucht, dann wird dies einen Fehler aus, wie unten dargestellt:

Session2:

select * from dept where deptno =10 for update nowait; 

Dieser Benutzer kann nicht einmal die gleichen Datensätze aktualisieren oder löschen die von der ersten Sitzung gesperrt wurden.

ERROR at line 1: 
`ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired` 

Verbrauch: Nun, wenn Sie eine gewisse Manipulation auf bestimmte Gruppen von Datensätzen tun wollen, und Sie wollen nicht, einen anderen Benutzer aus einer anderen Sitzung Ihre Daten zu überschreiben, müssen Sie zuerst die Datensätze sperren (mit for update nowait) und dann mach deine Manipulation. Wenn Sie mit Ihrer Manipulation fertig sind, schließen Sie den Cursor und bestätigen Sie.

EDIT in meine Session 1 Angenommen, ich das folgende Skript ausgeführt haben:

declare 
cursor abc is select * from temp ; 
temp abc%rowtype; 
begin 
open abc; 
end; 

jetzt in Session 2 I ausgeführt

select * from temp ; 

0 rows found 

Wenn ich das gleiche Skript ausführen wieder

declare 
cursor abc is select * from temp ; 
temp abc%rowtype; 
begin 
open abc; 
end; 

Dann bekomme ich ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired instead of waiting the lock to release.

+0

Also wenn ich keine warte, kann ich nicht sogar (select) die gleiche Zeile von anderer Sitzung holen, bin ich richtig? – user1

+0

Wenn ich die gleiche Zeile aus einer anderen Sitzung abrufen, aber nicht aktualisieren möchte, wie soll ich damit umgehen? – user1

+0

@ user1: Ja, Sie können dieselben Zeilen aus der anderen Sitzung auswählen, aber Sie können nicht dieselben Zeilen sperren, wenn diese von einer anderen Sitzung gesperrt wurden. Ja, Sie können die Zeilen aus einer anderen Sitzung abrufen. –

Verwandte Themen