2011-01-12 3 views
3

Wir versuchen derzeit, ein SELECT FOR UPDATE zu implementieren, um Zeilen zu sperren. Wenn ich rufe:ORACLE PL/SQL: Testen von SELECT für UPDATE in Oracle SQL Developer

SELECT * FROM data where rowid = 'AAAQA5AAGAACNbEAA1' FOR UPDATE; 
SELECT * FROM data where rowid = 'AAAQA5AAGAACNbEAA1' FOR UPDATE NOWAIT; 

Ich bekomme nichts zurück in ORACLE SQL Developer. Soll das nicht einen Fehler auslösen? Hat das etwas mit der Verwendung derselben Benutzer-ID zu tun?

Antwort

5

Was meinst du mit „Ich bekomme nichts zurück“ laufen? Meinst du, dass keine Abfrage Zeilen zurückgibt? Wenn dies der Fall ist, bedeutet dies, dass in der Tabelle keine Zeilen mit dieser ROWID vorhanden sind. Meinst du, dass die erste (oder zweite) Aussage niemals zurückkommt? Wenn dies der Fall ist, wird die Sitzung blockiert, während auf die Sperre gewartet wird.

Sperren werden von Sitzungen gehalten. Wenn die beiden Anweisungen in derselben Sitzung ausgeführt werden, ist die zweite Anweisung erfolgreich, da die erste Anweisung bereits die Sperre erworben hat. Wenn die zweite Anweisung in einer anderen Sitzung ausgeführt wird, die zufällig von demselben Benutzer geöffnet wird, sollten Sie eine Ausnahme generieren, dass die Zeile bereits von einer anderen Sitzung gesperrt ist.

+0

Mein erster Gedanke war, dass, da ich von der gleichen Verbindung arbeitete, es einfach überschrieben wurde. Das hast du bestätigt. Vielen Dank. – jlrolin

1

Sie fordern eine Sperre für eine Tabelle an, die Sie bereits gesperrt haben dass Transaktion.

Sie benötigen die zweite SELECT aus einer anderen Verbindung (das heißt eine andere Transaktion)

+0

Das ist, was ich dachte ... danke. – jlrolin