我有一個表可能有兩個線程從中讀取數據。如果數據處於某種狀態(假設狀態爲1),那麼過程將執行某些操作(與此問題無關),然後將狀態更新爲2.鎖定SELECT以便其他進程不會獲取舊數據
在我看來,可能會出現這樣的情況,線程1和線程2都在相互之間的微秒內執行選擇,並且兩者都看到該行處於狀態1,然後兩者執行相同的操作,並在鎖定釋放後發生2次更新。
問題是:有沒有一種方法可以防止第二個線程能夠修改Postgres中的這些數據 - 也就是在第一個鎖的更新被釋放之後,它被強制執行另一個SELECT
,因此它知道爲了防止欺騙?
我看着行鎖定,但它說你不能阻止選擇語句,這聽起來像它不會在我的條件下工作在這裏。我唯一的選擇是使用諮詢鎖嗎?
請注意,在9.5中,您可以使用'FOR UPDATE SKIP LOCKED'來代替使用諮詢鎖來實現排隊。 http://michael.otacoo.com/postgresql-2/postgres-9-5-feature-highlight-skip-locked-row-level/。方式更容易。 – 2015-03-31 03:46:02
@CraigRinger:好消息。 :) – 2015-03-31 04:14:31
謝謝你們!這個答案有一些更有用的信息,所以我接受了它,但都提出了兩項。 – BryanP 2015-03-31 04:19:54