想象一下下面的場景,我們有一個表,其中行插入了一些約束。 例如,在修改數據和鎖定之前進行聚合檢查
- SELECT COUNT(*)FROM表WHERE ....
- 檢查,如果計數低於某個值
- 如果條件爲真 - INSERT ...,否則 - ROLLBACK
它的工作,如果我們沒有太多的併發查詢。 對於處理併發請求,有幾種方法:
- 將計數器保存到另一個表或Redis中。並在每次更新時管理此計數器。
- 每次插入前鎖定整個表格。
我正在使用PostgreSQL.What是解決這種情況的最佳方法?
想象一下下面的場景,我們有一個表,其中行插入了一些約束。 例如,在修改數據和鎖定之前進行聚合檢查
它的工作,如果我們沒有太多的併發查詢。 對於處理併發請求,有幾種方法:
我正在使用PostgreSQL.What是解決這種情況的最佳方法?
嘗試使用statement_timeout
和lock_timeout
明確set
而不是每個用戶會話。詳情請看here。
鎖定表格非常極端,會嚴重影響併發性。
在單獨的表中維護一個計數器會更好;它基本上會序列化INSERT
s(一旦前一個交易釋放了鎖定,下一個交易只能更新計數器)。
第三種方法是使用SERIALIZABLE
事務。如果涉及的所有交易都是SERIALIZABLE
,則只要您在單個交易中執行SELECT count(*) ...
和INSERT
,就會自動保證您的條件。 不足之處是事務可能因序列化錯誤而中止,並且您必須準備好重試它們。
謝謝你的回答。 – user3928409
這是怎麼連接到這個問題? –