2015-12-16 34 views
3

我需要使用表鎖定(寫入)以及更新一些表,所以我需要同時處理事務,因爲鎖定不是事務安全的。與表鎖定的Mysql事務

從MySQL文檔我讀使用LOCK TABLES和UNLOCK與 事務表,如InnoDB表TABLES以下 https://dev.mysql.com/doc/refman/5.6/en/lock-tables-and-transactions.html

正確的方法,是用SET自動提交= 0開始一個事務 (不是開始交易),然後是LOCK TABLES,並且在您明確提交交易 之前不要調用UNLOCK TABLES。例如,如果你需要寫表t1並從表t讀 ,你可以這樣做:

SET autocommit=0; 
LOCK TABLES t1 WRITE, t2 READ, ...; 
... do something with tables t1 and t2 here ... 
COMMIT; 
UNLOCK TABLES; 

當你調用LOCK TABLES時,InnoDB內部需要它自己的表鎖, 和MySQL需要它自己的表鎖。 InnoDB在下次提交時釋放內部表 鎖,但是爲了釋放其表鎖,MySQL 必須調用UNLOCK TABLES。你不應該有autocommit = 1, ,因爲然後InnoDB在 之後立即釋放它的內部表鎖,並且死鎖很容易發生。如果自動提交= 1,InnoDB 根本不會獲取內部表鎖,但可以幫助舊應用程序避免不必要的死鎖。

此網頁上,我們有 https://dev.mysql.com/doc/refman/5.6/en/commit.html

要爲一個系列的 語句隱含禁用自動提交模式,使用START TRANSACTION語句另一方面:

START TRANSACTION; 
SELECT @A:=SUM(salary) FROM table1 WHERE type=1; 
UPDATE table2 SET [email protected] WHERE type=1; 
COMMIT; 

隨着START TRANSACTION,自動提交將保持禁用狀態,直到您使用COMMIT或ROLLBACK結束 事務。自動提交模式然後將 恢復到之前的狀態。

因此,如果與START TRANSACTION禁用自動提交,那麼爲什麼在表鎖定部分它說,正確的做法是to begin a transaction with SET autocommit = 0 (not START TRANSACTION)。我錯過了什麼或者這兩者之間有矛盾?我可以使用START TRANSACTION進行表鎖定嗎?我正在使用InnoDB。

感謝

+0

爲什麼你覺得你需要使用表鎖?爲什麼行鎖定不充分? –

+0

多個腳本應該並行工作,'select for update'不好,(我猜你的意思是這樣),因爲他們應該選擇,更新和插入,所以整個表應該被鎖定,所以腳本將同步工作 – dav

回答