Mysql update 子查詢鎖表問題。
今天碰到詭異的表死鎖問題。
首先Tomcat報錯:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
使用 show engine innodb status .
檢視mysql死鎖。
發現是 update語句中把子查詢中的表給死鎖了。比如
update table_a set comments = (select count(1) from table_b where id = table_a.id) where id = 123;
把table_b給鎖住了。
搜尋了一個,發現是mysql的問題。
http://shen2.cn/2013/06/sub-query-in-update-locked-table/
---2015/1/11 日更新---
最後發現這個不是mysql bug,
mysql 預設的隔離級別是REPEATABLE-READ,oracle預設資料隔離級別是 READ-COMMITTED 。所以在mysq中
update ... select * from
insert into .... select * from
這些語句中,都會鎖住子表的row.
將mysql 隔離級別改成
SET session TRANSACTION ISOLATION LEVEL READ COMMITTED;
問題就解決了。