我需要使用表锁定(写)和更新的几个表,所以我需要事务同时进行,因为锁不是事务安全的。
从mysql文档中,我阅读了以下https://dev.mysql.com/doc/refman/5.6/en/lock-tables-and-transactions.html
使用带有事务性表(如InnoDB表)的锁表和解锁表的正确方法是以SET自动提交=0(非启动事务)开始事务,然后是锁表,并在显式提交事务之前不调用解锁表。例如,如果您需要写入表t1并从表t2中读取,您可以这样做: 设置autocommit=0;锁表t1写,t2读取,.用桌子t1和t2做点什么..。提交;解锁表; 当您调用锁表时,InnoDB内部使用它自己的表锁,而MySQL使用它自己的表锁。InnoDB在下一次提交时释放其内部表锁,但要使MySQL释放其表锁,则必须调用解锁表。您不应该有自动提交= 1,因为然后InnoDB在调用锁表之后立即释放它的内部表锁,死锁很容易发生。如果自动提交=1时,InnoDB根本不获取内部表锁,以帮助旧应用程序避免不必要的死锁。
另一方面,从这个页面我们有https://dev.mysql.com/doc/refman/5.6/en/commit.html
若要隐式禁用单个系列语句的自动提交模式,请使用START TRANSACTION语句: 启动事务;从table1 WHERE type=1中选择type=1(工资);更新table2 SET summary=@A SET type=1;提交; 使用START TRANSACTION,自动提交将保持禁用状态,直到您使用提交或回滚结束事务为止。然后,自动提交模式恢复到以前的状态。
因此,如果使用START TRANSACTION禁用了自动提交,那么为什么在表锁定部分中说正确的方法是to begin a transaction with SET autocommit = 0 (not START TRANSACTION)。我是遗漏了什么,还是这两者之间有矛盾?我可以在表锁定时使用START TRANSACTION吗?我正在使用InnoDB。
谢谢
发布于 2016-09-17 20:02:33
https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
https://stackoverflow.com/questions/34318783
复制相似问题