2016-07-26 61 views
0

想象一下下面的場景,我們有一個表,其中行插入了一些約束。 例如,在修改數據和鎖定之前進行聚合檢查

  1. SELECT COUNT(*)FROM表WHERE ....
  2. 檢查,如果計數低於某個值
  3. 如果條件爲真 - INSERT ...,否則 - ROLLBACK

它的工作,如果我們沒有太多的併發查詢。 對於處理併發請求,有幾種方法:

  1. 將計數器保存到另一個表或Redis中。並在每次更新時管理此計數器。
  2. 每次插入前鎖定整個表格。

我正在使用PostgreSQL.What是解決這種情況的最佳方法?

回答

0

嘗試使用statement_timeoutlock_timeout明確set而不是每個用戶會話。詳情請看here

+0

這是怎麼連接到這個問題? –

0

鎖定表格非常極端,會嚴重影響併發性。

在單獨的表中維護一個計數器會更好;它基本上會序列化INSERT s(一旦前一個交易釋放了鎖定,下一個交易只能更新計數器)。

第三種方法是使用SERIALIZABLE事務。如果涉及的所有交易都是SERIALIZABLE,則只要您在單個交易中執行SELECT count(*) ...INSERT,就會自動保證您的條件。 不足之處是事務可能因序列化錯誤而中止,並且您必須準備好重試它們。

+0

謝謝你的回答。 – user3928409