首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有表锁定的Mysql事务

带有表锁定的Mysql事务
EN

Stack Overflow用户
提问于 2015-12-16 17:48:02
回答 1查看 3.4K关注 0票数 6

我需要使用表锁定(写)和更新的几个表,所以我需要事务同时进行,因为锁不是事务安全的。

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

谢谢

EN

回答 1

Stack Overflow用户

发布于 2016-09-17 20:02:33

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

  • 锁表是事务安全的,并且在试图锁定表之前隐式地提交任何活动事务。
  • 启动事务(例如,使用START事务)隐式提交任何当前事务,释放现有表锁定
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34318783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档