問題描述:
java代碼在開始事務后,先做了一個查詢,再insert,此時會報:
java.sql.SQLException: could not retrieve transation read-only status server
解決過程:
查看mysql的事物隔離級別 SHOW VARIABLES LIKE '%iso%';
返回結果: REPEATABLE-READ
把這個改成:READ-COMMITTED 就好了: SET GLOBAL tx_isolation='READ-COMMITTED';
(記得java重啟應用,要永久生效的就改my.ini配置文件)
問題分析:
當數據庫隔離級別為REPEATABLE-READ時,查詢一個select語句也算是事物的開始,而且在hibernate里會把以select語句開頭的事務標記為只讀事務,此時在這個事務里再執行insert、update、delete等DML語句就會報錯。
http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_tx_read_only
