我有一个mysql数据库(InnoDB引擎),我在做一些工作之前锁定了几个表。根据{{3}}
"将LOCK TABLES和UNLOCK TABLES与事务表(如InnoDB表)一起使用的正确方法是使用SET autocommit = 0(不是START TRANSACTION)开始事务,然后是LOCK TABLES,在明确提交事务之前不要调用UNLOCK TABLES。"
所以我正在做(伪代码):
mysqli_query("SET autocommit=0");
mysqli_query("LOCK TABLES table1 WRITE, table2 READ ...");
mysqli_query("SOME SELECTS AND INSERTS HERE");
mysqli_query("COMMIT");
mysqli_query("UNLOCK TABLES");
现在,我是否也应该这样做:
mysqli_query("SET autocommit=1");
再次根据文件,
"当你调用LOCK TABLES时,InnoDB内部采用自己的表锁,而MySQL则采用自己的表锁。 InnoDB在下次提交时释放其内部表锁,但是为了释放其表锁,MySQL必须调用UNLOCK TABLES。你不应该有autocommit = 1,因为然后InnoDB在调用LOCK TABLES后立即释放它的内部表锁,并且很容易发生死锁。如果autocommit = 1,InnoDB根本不会获取内部表锁,以帮助旧应用程序避免不必要的死锁。"
我认为文档在这一点上有点模糊。在我解释它时,您不应该使用SET autocommit=1
代替UNLOCK TABLES
。
但是,在桌子解锁后不应该有任何伤害吗?
但我仍然不确定是否有必要。在COMMIT之后,我在同一个脚本中运行了一个选择,即使我不是SET autocommit=1
,它似乎也会自动提交。为什么呢?