生活随笔
收集整理的這篇文章主要介紹了
MySQL innodb引擎,事务提交 commit 异常,但数据提交成功
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
昨天線上服務(wù)出現(xiàn)的奇怪的異常,數(shù)據(jù)庫中數(shù)據(jù)已經(jīng)提交(都是innodb引擎), 但是java代碼拋出異常,并從日志分析是commit異常,最后在catch中的rollback都為時已晚。
這次的異常可與之前的與眾不同,之前的如果commit異常了,數(shù)據(jù)肯定是回滾了(mysql服務(wù)器沒有收到commit,并且連接已經(jīng)中斷),但是現(xiàn)在commit異常了,但是服務(wù)器數(shù)據(jù)沒有回滾。最近還款較多,經(jīng)常出現(xiàn)這種奇葩的問題。
進過分析得出:
1. 數(shù)據(jù)庫都已開啟事務(wù)支持
2. Connection 連接 已經(jīng)開啟事務(wù)(autocommit=false)
3. conn.commit 拋出異常,catch中有記錄錯誤和執(zhí)行rollback
4. 數(shù)據(jù)庫中的數(shù)據(jù)竟然已經(jīng)寫入 (即已經(jīng)完成commit)
5. 根據(jù)分析數(shù)據(jù)庫中的數(shù)據(jù)值,已經(jīng)確認(rèn) commit 確實已經(jīng)提交成功,同時java中的commit又拋出了異常,且運行了 catch中的代碼
Caused by:
com.mysql.jdbc.exceptions.jdbc4
.MySQLNonTransientConnectionException: Communications link failure during commit(). Transaction resolution unknown.at sun
.reflect.GeneratedConstructorAccessor75
.newInstance(Unknown Source)at sun
.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl
.java:
45)at java
.lang.reflect.Constructor.newInstance(Constructor
.java:
526)at
com.mysql.jdbc.Util.handleNewInstance(Util
.java:
411)at
com.mysql.jdbc.Util.getInstance(Util
.java:
386)at
com.mysql.jdbc.SQLError.createSQLException(SQLError
.java:
1013)at
com.mysql.jdbc.SQLError.createSQLException(SQLError
.java:
987)at
com.mysql.jdbc.SQLError.createSQLException(SQLError
.java:
982)at
com.mysql.jdbc.SQLError.createSQLException(SQLError
.java:
927)at
com.mysql.jdbc.ConnectionImpl.commit(ConnectionImpl
.java:
1663)at
com.alibaba.druid.filter.FilterChainImpl.connection_commit(FilterChainImpl
.java:
180)at
com.alibaba.druid.filter.FilterAdapter.connection_commit(FilterAdapter
.java:
780)at
com.alibaba.druid.filter.FilterChainImpl.connection_commit(FilterChainImpl
.java:
176)at
com.alibaba.druid.filter.FilterAdapter.connection_commit(FilterAdapter
.java:
780)at
com.alibaba.druid.filter.logging.LogFilter.connection_commit(LogFilter
.java:
402)at
com.alibaba.druid.filter.FilterChainImpl.connection_commit(FilterChainImpl
.java:
176)at
com.alibaba.druid.filter.stat.StatFilter.connection_commit(StatFilter
.java:
260)at
com.alibaba.druid.filter.FilterChainImpl.connection_commit(FilterChainImpl
.java:
176)at
com.alibaba.druid.filter.FilterAdapter.connection_commit(FilterAdapter
.java:
780)at
com.alibaba.druid.filter.FilterChainImpl.connection_commit(FilterChainImpl
.java:
176)at
com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.commit(ConnectionProxyImpl
.java:
123)at
com.alibaba.druid.pool.DruidPooledConnection.commit(DruidPooledConnection
.java:
723)at org
.springframework.jdbc.datasource.DataSourceTransactionManager.doCommit(DataSourceTransactionManager
.java:
268)at org
.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager
.java:
755)
spirng-3.2.3
druid-1.0.16
mysql-connector-java-5.1.18
這么奇葩的問題很難碰巧遇到,我們竟然遇到了,堆棧日志有一百多行省略了,沒法準(zhǔn)確追查源碼,經(jīng)過分析mysql-connector-java源碼,很有可能是 commit命令已經(jīng)發(fā)送到了mysql服務(wù)器并執(zhí)行,在接受應(yīng)答回包的時候,中途網(wǎng)絡(luò)出現(xiàn)問題,導(dǎo)致數(shù)據(jù)包丟失,從而形成網(wǎng)絡(luò)異常,即造成 commit 異常,這種還是小概率事件。
在進過初步分析后,經(jīng)過幾天的測試可以確定是一個實現(xiàn)MySQL高可用的中間件導(dǎo)致的,目前已經(jīng)直連了MySQL主服務(wù),從未出現(xiàn)過之前的這種錯誤。
總結(jié)
以上是生活随笔為你收集整理的MySQL innodb引擎,事务提交 commit 异常,但数据提交成功的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。