比方說,我有類似下面的代碼:如何在選擇鎖定,不只是插入/更新/刪除
begin
select ... from T where x = 42; -- (1)
.
.
.
update T ... where x = 42; -- (2)
commit;
end;
我是在說,由(2)執行時是正確的,有什麼在T被選擇(1)可能不再是T,如果,例如,在另一會話執行下列執行:
delete from T where x = 42;
如果是這樣,我想發生這樣的select語句「鎖'T
,所以它不能被修改。
我知道我可以通過做明確地做到這一點:
lock table T in exclusive mode;
但如果T
一種觀點?我一定要看看通過T
觀/子視圖的定義,找到它引用的所有表和單獨鎖定它們,或者我可以做這樣的事情:
begin
START_TRANSACTION;
select ... from T where x = 42; -- (1)
.
.
.
update T ... where x = 42; -- (2)
commit;
end;
凡START_TRANSACTION
確保鎖定所有表中提到的所有選擇語句直到交易完成?
或者是否有另一個更好的解決這個問題?如果這很重要,我正在使用Oracle 10g。
您需要'SELECT ... FOR UPDATE'來鎖定您從表中讀取的行。仔細閱讀有關隔離級別和事務的所有信息。 –