表锁定的

时间:2015-12-16 17:48:03

标签: mysql transactions locking table-locking

我需要使用表锁定(write)以及更新一些表,因此我需要同时进行事务处理,因为锁定不是事务安全的。

从mysql文档中我读了以下内容 https://dev.mysql.com/doc/refman/5.6/en/lock-tables-and-transactions.html

  

使用LOCK TABLES和UNLOCK TABLES的正确方法   事务表(例如InnoDB表)将开始一个事务   使用SET autocommit = 0(不是START TRANSACTION),然后是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释放它的表锁,你   必须打电话给UNLOCK TABLES。你不应该有autocommit = 1,   因为然后InnoDB立即释放其内部表锁   LOCK TABLES的调用和死锁很容易发生。 InnoDB的   如果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。

由于

1 个答案:

答案 0 :(得分:2)

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

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