2011-01-12 125 views
3

我們目前正試圖實現SELECT FOR UPDATE來鎖定行。如果我運行:ORACLE PL/SQL:在Oracle SQL Developer中測試SELECT FOR UPDATE

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

我在ORACLE SQL Developer中沒有得到任何回報。這不應該給我一個錯誤?這是否與使用相同的用戶ID有關?

回答

5

你說的「我得不到任何回報。」是什麼意思?你的意思是這兩個查詢都不返回任何行嗎?如果是這樣,那意味着表中沒有具有該ROWID的行。你的意思是第一個(或第二個)聲明永遠不會返回?如果是這樣,會話被阻止,等待獲得鎖。

鎖定按會話進行。如果兩個語句在同一個會話中運行,則第二個語句將成功,因爲第一個語句已經獲得該鎖。如果第二條語句在恰好由同一用戶打開的不同會話中運行,則應該生成該行已被另一個會話鎖定的異常。

+0

我最初的想法是,因爲我正在關閉同一個連接,所以這只是覆蓋。你已經證實了。謝謝。 – jlrolin 2011-01-13 14:29:45

1

您要求在已鎖定的表上鎖定事務。

您需要從不同的連接(即不同的事務)運行第二個SELECT

+0

這就是我認爲......謝謝。 – jlrolin 2011-01-12 20:42:53