本文共 808 字,大约阅读时间需要 2 分钟。
在测试Cobar的过程中发现了一个问题,就是当一个session执行了lock table xxx write后,其他session包括该session都查询不了其他表了,直到有一个session执行了unlock tables;简例如下:
session1:
mysql> create table t (id int primary key)engine=innodb;
Query OK, 0 rows affected (0.08 sec)
session2:
lock table t write;
session1:
mysql> select * from sbtest limit 1;
ERROR 1100 (HY000): Table 'sbtest' was not locked with LOCK TABLES
session2:
unlock tables or quit;
session1:
can select other tables;
但是不同的session却可以保证事务的隔离性,这是为什么呢?其实答案就在这句话里;
默认情况下MySQL的autocommit=1,并且使用Cobar默认情况是初始化一个共享后端连接;
当一个session执行lock table write返回后,这个后端连接会被释放到连接池里(MySQLChannel)等待被重用,这时如果再有其他session执行查询的话拿到的连接其实是lock tablewrite的状态,所以才有上面的那个现象;
要work around也很简单,就是在执行lock tablewrite之前执行setautocommit=0,这样这个连接不会释放回去直到提交;
本文转自MIKE老毕 51CTO博客,原文链接:http://blog.51cto.com/boylook/1298646,如需转载请自行联系原作者