我有一個 nodejs 程式,它使用 sequelize 創建表并基于它插入資料。
現在,將來我們將擁有程式的多個實體,因此我們不希望在程式啟動期間從表中讀取多個實體,以便在需要時只有一個實體可以執行設定操作,而其他實體不應該得到對表的“任何訪問”,直到第一個實體完成它的作業。
我已經檢查了“事務鎖定” -共享和獨占,但它們似乎都提供了對我不想要的表的讀取訪問權限。
我的具體要求是,一旦事務獲得表上的鎖定,除非第一個事務完成它的作業,否則其他事務不應該能夠從該表中讀取。我怎樣才能做到這一點?
uj5u.com熱心網友回復:
如手冊中所述,鎖定表的陳述句是,LOCK TABLE ...
如果您以獨占模式鎖定表,則不允許其他訪問 - 甚至是 SELECT。獨占模式是默認的:
如果未指定鎖定模式,則使用最嚴格的 ACCESS EXCLUSIVE 模式。
該手冊解釋了不同的鎖定模式:
ACCESS EXCLUSIVE
此模式保證持有者是唯一以任何方式訪問表的事務。
uj5u.com熱心網友回復:
在 MySQL 中使用LOCK TABLES來鎖定整個表。
在 postgresqlLOCK TABLE whatever IN EXCLUSIVE MODE;中就可以了。
為獲得最佳結果,您的應用程式在啟動時,請查找特定表。做一些簡單快速的事情,比如SELECT id FROM whatever LIMIT 1;探測表是否存在。如果您的應用程式因為表不存在而出現例外,請執行
CREATE TABLE whatever ....;
LOCK TABLES whatever WRITE;
從創建表的應用程式。它會阻止從您的應用程式的所有實體訪問表,但獲得 LOCK 的實體除外。
一旦您的表被鎖定,SELECT我建議的初始值將阻止其他客戶端。如果兩個客戶端嘗試或多或少地同時創建表,則可能存在競爭條件。但是額外的 CREATE TABLE 會拋出例外。
注意:如果您鎖定了多個表,并且可以從多個應用程式實體運行代碼,請始終以相同的順序鎖定表,否則您可能會出現死鎖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/412259.html
標籤:
