在測試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;
mysql> select * from sbtest limit 1;
ERROR 1100 (HY000): Table 'sbtest' was not locked with LOCK TABLES
unlock tables or quit;
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,如需轉載請自行聯系原作者