在测试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却可以保证事务的隔离性,这是为什么呢?其实答案就在这句话里;

默认情况下MySQLautocommit=1,并且使用Cobar默认情况是初始化一个共享后端连接;

当一个session执行lock table write返回后,这个后端连接会被释放到连接池里(MySQLChannel)等待被重用,这时如果再有其他session执行查询的话拿到的连接其实是lock tablewrite的状态,所以才有上面的那个现象;

work around也很简单,就是在执行lock tablewrite之前执行setautocommit=0,这样这个连接不会释放回去直到提交;