簡體   English   中英

PostgreSQL中的表鎖

[英]Table lock in PostgreSQL

我正在開發一個應從一個表中獲取數據並在另一表中記錄處理結果的應用程序。 所有這些都在一個線程和幾台計算機上完成。 因此,我需要為此使用一些同步機制。 至於我需要使用更多的一台計算機,我必須在數據庫中使用某種同步機制(在我的情況下是PostgresSQL),而不是使用代碼鎖定。 我知道postgres提供了對表的鎖定,但是我沒有找到任何文檔來設置它。

可能已經有一些標准的解決方案了嗎?

是的,Postgres在表級別提供了鎖定機制。 您可以使用SQL鎖定表,然后在完成工作后將其解鎖。

有關詳細信息,請參見手冊的顯式鎖定章節

但是考慮到您的情況,您可以使用一些簡單的機制來實現相同的目的,例如,向表中增加一列-locking_status布爾值。 一台機器使用它時,可以將其設置為TRUE,然后根據需要進行切換。 但是,如果您有多個表,那么鎖定表是唯一的選擇。

您還需要照顧高度可擴展的多線程程序,因為一個應用程序可能已鎖定了表,然后該計算機可能會關閉。 在這種情況下,您的表將保持鎖定狀態,應用程序將變得無響應。 (但是取決於您如何處理此狀態)。 在這種情況下,某種過期機制可能會有所幫助,它將在特定時間后解鎖表。

希望這可以幫助。

<clippy>
看來您正在嘗試編寫任務隊列消息隊列 這些真的很難解決。 您是否希望我提出一個經過良好測試的現有實現方案供您使用?
</ clippy>

更嚴重的是:表級鎖定是通過LOCK TABLE語句完成的; 參見韋德的答案。 還存在行級鎖( SELECT ... FOR [KEY] UPDATE|SHARE )和SERIALIZABLE隔離中的樂觀謂詞鎖。 您還可以實現樂觀並發控制(請參閱Wikipedia)。

但是,實際上很難創建並發任務或消息隊列。 您提出的大多數解決方案實際上都會序列化,因此一次只能執行一個任務,否則將無法處理中止/崩潰等任務。

看到:

並研究諸如Celery,ZeroMQ,ActiveMQ,RabbitMQ,Octobot等工具。請參見http://queues.io/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM