1. 程式人生 > >Mysql update 子查詢鎖表問題。

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; 

問題就解決了。