2008-11-25 31 views
5

在我工作的項目中,有一個帶有「on update」觸發器的表,用於監視布爾列是否已更改(例如:false - > true =執行某個操作)。但是這個行爲只能連續進行一次。Postgresql併發

將有多個客戶端訪問數據庫,所以我可以假設最終,多個客戶端將嘗試並行更新同一行列。

「更新」觸發器本身是否處理併發本身,或者我需要在事務中執行並手動鎖定表?

+0

當有許多觸發器同時激活時,您是否觀察到任何顯着的性能下降? – ady 2015-05-11 11:41:47

回答

17

觸發器無法處理併發性,無論您是否使用顯式事務,PostgreSQL都應該做正確的事情。

PostgreSQL使用樂觀鎖定這意味着第一個實際更新行的人在該行上獲取鎖定。如果第二個人試圖更新該行,他們的更新語句將等待第一個人是否提交更改或回滾。

如果第一個人提交,第二個人會得到一個錯誤,而不是他們的變化,並消除他們可能感興趣的變化。

如果第一個人回滾,第二個人的更新解除阻塞並且正常通過,因爲現在它不會覆蓋任何東西。

第二個人也可以使用NOWAIT選項,如果它們的更新與未解決的更改衝突,就會立即發生錯誤而不是阻塞。

+1

+1使用「消除」一詞。 – swasheck 2012-01-26 23:15:40