带表锁定的Mysql事务

问题描述 投票:0回答:2

我需要使用表锁定(写入)并同时更新一些表,因此我同时需要事务,因为锁定不是事务安全的。

从 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。

谢谢

mysql transactions locking table-locking
2个回答
3
投票

https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html

  • LOCK TABLES 不是事务安全的,并且会在尝试锁定表之前隐式提交任何活动事务。
  • 开始事务(例如,使用 START TRANSACTION)会隐式提交任何当前事务并释放现有表锁

0
投票

Maria DB 上的这个案例。 。没有使用任何提交。 锁似乎会结束事务,因此所有更改都会应用。 不确定在“未更新”场景期间,表是否保持锁定状态,无法被其他查询读取数据。

开始 锁 改变 回滚 解锁

更新记录

开始 锁 改变 开锁 回滚

更新记录

锁定 开始 改变 回滚 解锁

没有更新记录

锁定 开始 改变 开锁 回滚

没有更新记录

开始 改变 回滚

没有更新记录

© www.soinside.com 2019 - 2024. All rights reserved.