最近剛接手個新項目的測試平臺採用了spring的事務機制,在用戶認證登錄時總是提示認證超時,於時查看相應的各應用服務器日誌,發現報了異常:
Binary logging not possible. Message: Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT'...
......
前端某臺應用服務器報如下錯:
{"returnNo":0,"listField":[{"userCode":"admin","newPassword":"","sessionKey":"","password":"670b14728ad9902aecba32e22fa4f6bd","ip":"192.168.1.75"}],"returnObject":null,"commondId":"8000"}
java.io.IOException: Server returned HTTP response code: 500 for URL: http://xxxxx/xxxxxx
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1313)
其實通過最上面那條錯誤可以判斷問題出在哪了.由於innodb 和 binlog不兼容引起的...MySQL推薦:當設置隔離級別爲READ-COMMITED必須設置行日誌格式爲ROW,現在MySQL官方也明確說明STATEMENT 這個已經不建議用了!
當前系統的事務隔離級別是: READ-COMMITTED,行日誌格式是:STATEMENT
這裏可以有兩種解決辦法:
一種是提升事物隔離級別爲 REPEATABLE-READ,這是MySQL默認的事務隔離級別;
mysql> set global transaction isolation level repeatable read;
一種是保持當前的事務隔離級別,修改行日誌格式爲 MIXED 或 ROW.
這裏修改配置文件:
binlog_format = row
#binlog_format = MIXED
重啓服務
有個特別要注意的問題,如果 binlog_format 爲 MIXED,而且使用的是默認隔離級別REPEATABLE-READ,那麼會導致主從數據不一致。
參考賀總博客:http://hcymysql.blog.51cto.com/5223301/1021174