交易和锁定MySQL

时间:2014-07-11 00:44:29

标签: mysql

我需要一些关于事务的清晰度并锁定mysql

首先。需要在不同的表中执行两次或三次插入,但如果其中任何一个失败,则取消整个操作。所以来了。

 START TRANSACTION

但在所有需要线程成为访问这些表的唯一之前。来了

 LOCK TABLES tab1 WRITE, tab2 WRITE

我应该先做什么? 是按照这个顺序进行的吗?

 START TRANSACTION;
 LOCK TABLE....;

 INSERT INTO ...;
 if (something wrong)
 {
   ROLLBACK;
   UNLOCK TABLES;
   return;
 }

 INSERT INTO ...;
 if (something wrong)
 {
   ROLLBACK;
   UNLOCK TABLES;
   return;
 }

 COMMIT;
 UNLOCK TABLES;

这篇文章有一些伪JAVA 非常感谢你。

1 个答案:

答案 0 :(得分:1)

使用事务时,db引擎会自动处理表锁定。使用显式锁定语句甚至可能对transactional code

有害
  

13.3.5.1表锁定和交易的交互

     
      
  • LOCK TABLES和UNLOCK TABLES与交易的使用相互作用如下:

  •   
  • LOCK TABLES 不是事务安全的,并在尝试锁定表之前隐式提交任何活动事务。

  •   
  • UNLOCK TABLES隐式提交任何活动事务,但仅当LOCK TABLES用于获取表锁时才会提交。 [...]

  •   

虽然在您的脚本伪代码中,您只能在任何其他命令之前使用LOCK TABLE

从程序逻辑的角度来看,您的webapp的其他功能可能会触发相同表的更新?如果您只想阻止在事务中发生外部更新,则正确的transaction isolation(即不READ UNCOMMITED)应该可以防止任何副作用。