dav*_*dav 5 mysql locking transactions table-locking
我需要使用表锁定(写入)并同时更新一些表,因此我同时需要事务,因为锁定不是事务安全的。
从 mysql 文档中,我阅读了以下内容 https://dev.mysql.com/doc/refman/5.6/en/lock-tables-and-transactions.html
对事务表(例如 InnoDB 表)使用 LOCK TABLES 和 UNLOCK TABLES 的正确方法是使用 SET autocommit = 0(不是 START TRANSACTION)开始事务,然后是 LOCK TABLES,并且在提交事务之前不调用 UNLOCK TABLES明确地。例如,如果您需要写入表 t1 并从表 t2 读取,您可以这样做:
Run Code Online (Sandbox Code Playgroud)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 在调用 LOCK TABLES 后立即释放它的内部表锁,很容易发生死锁。如果 autocommit = 1,InnoDB 根本不获取内部表锁,以帮助旧应用程序避免不必要的死锁。
另一方面,从这个页面我们有 https://dev.mysql.com/doc/refman/5.6/en/commit.html
要为一系列语句隐式禁用自动提交模式,请使用 START TRANSACTION 语句:
Run Code Online (Sandbox Code Playgroud)START TRANSACTION; SELECT @A:=SUM(salary) FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;使用 START TRANSACTION,自动提交将保持禁用状态,直到您使用 COMMIT 或 ROLLBACK 结束事务。自动提交模式然后恢复到以前的状态。
所以,如果 withSTART TRANSACTION禁用自动提交,那么为什么在表锁定部分它说正确的方法是to begin a transaction with SET autocommit = 0 (not START TRANSACTION). 我是否遗漏了什么或者这两者之间存在矛盾?我可以START TRANSACTION与表锁定一起使用吗?我正在使用 InnoDB。
谢谢
https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
- LOCK TABLES 不是事务安全的,并且在尝试锁定表之前隐式提交任何活动事务。
- 开始事务(例如,使用 START TRANSACTION)会隐式提交任何当前事务并释放现有的表锁。
| 归档时间: |
|
| 查看次数: |
3046 次 |
| 最近记录: |