如何阻止一個線程的事務讀取一行,直到另一個事務完成處理?鎖定Oracle行,使第二個線程無法讀取數據
我在Oracle 11 DB上有一個觸發器表。觸發器表上的一行有一個狀態標誌,用於指示是否需要執行一個進程 - 假設它是觸發電子郵件。有定期輪詢觸發表的abatch進程。這個過程是:觸發
- GET X數,其中狀態NOT_SENT X的
- 更新狀態觸發在發送
- 發送X電子郵件X的
- 更新狀態觸發到SENT
但我在集羣環境中運行我的應用程序。所以可能有多個版本的批處理過程並行地觸發觸發器。我想確保競爭性的批處理過程不會拉下相同的觸發器並執行相同的處理,即發送相同的電子郵件。
我正在查看Oracle SELECT FOR UPDATE子句。但是,如果這不符合我的要求,我並不十分清楚。我需要線程A來鎖定觸發器行,並且線程B被阻止讀取或寫入觸發器行。如果SELECT FOR UPDATE阻止線程B讀寫,或者僅阻止線程B寫入,這並非100%清楚。我需要前者。
思想歡迎。
你不能這樣做。在Oracle閱讀中永遠不能被阻止。你只能阻止與你有合同的人。即另一個線程必須嘗試鎖定您持有的同一個鎖。 無論您是否都執行'select .. for update'或使用dbms_lock,都沒關係。 – ibre5041
一般而言,**讀者不會阻止作者和作者不會阻止讀者**。 –
@ ibre5041這與以下Justin Cave的答案相矛盾。他說SELECT FOR UPDATE首先鎖定然後讀取。我會測試確認。 – CodeClimber