我需要使用表锁定(写入)并同时更新一些表,因此我同时需要事务,因为锁定不是事务安全的。
从 mysql 文档中我读到了以下内容 https://dev.mysql.com/doc/refman/5.6/en/lock-tables-and-transactions.html
使用 LOCK TABLES 和 UNLOCK TABLES 的正确方法 事务表,比如InnoDB表,就是开始一个事务 SET autocommit = 0(不是开始事务)后跟 LOCK TABLES,并且在提交事务之前不调用 UNLOCK TABLES 明确地。例如,如果您需要写入表 t1 并读取 从表 t2 中,您可以执行以下操作:
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 释放其表锁,您 必须调用解锁表。你不应该让 autocommit = 1, 因为InnoDB会立即释放其内部表锁 LOCK TABLES 的调用,很容易发生死锁。数据库 如果 autocommit = 1,则根本不获取内部表锁 帮助旧应用程序避免不必要的死锁。
另一方面,从这个页面我们可以看到 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 summary=@A WHERE type=1; COMMIT;
使用 START TRANSACTION,自动提交将保持禁用状态,直到您结束 使用 COMMIT 或 ROLLBACK 进行事务处理。然后恢复自动提交模式 恢复到之前的状态。
所以,如果使用
START 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)会隐式提交任何当前事务并释放现有表锁。
Maria DB 上的这个案例。 。没有使用任何提交。 锁似乎会结束事务,因此所有更改都会应用。 不确定在“未更新”场景期间,表是否保持锁定状态,无法被其他查询读取数据。
更新记录
更新记录
没有更新记录
没有更新记录
没有更新记录