Transaction resolution unknown.

2015/06/11 00:03:24,228 [ERROR] [http-bio-1081-exec-4] [com.xx.sxSendSms(SmsService.java:185)]  java.net.SocketTimeoutException: Read timed out

2015/06/11 00:03:24,230 [ERROR] [http-bio-1081-exec-4] com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during rollback(). Transaction resolution unknown.


最近线上的服务老是出现这个错误,比较多的地方是在一个发送短信的地方,大体意思如下(代码不是我写的,且不论代码逻辑的好坏):

conn = MySQL.getconnect()

try{

  template = conn.query()

  bsuccess = http.sendSms()

  conn.insert()

}catch(...){}

if (!bsuccess)

   conn.rollback()


从日志分析可以看出HTTP请求超时了(链接超时60ms, 读取超时60ms),接着执行rollback,在rollback的时候出错了,一开始以为是HTTP请求超时影响的(interactive_timeout),后来查询和修改interactive_timeout,并写代码测试,发现不是interactive_timeout的问题。

后来一个一个的查看日志中的这个错误,终于发现了其他地方也有这个错误(Transaction resolution unknown.),并且这几个是在commit的时候,这函数都只有一个数据库的操作,为了将问题重现,写了如下伪代码:


con.query()

sleep(10)

conn.roolback()


在sleep期间将电脑的网断掉,果然出现的相同的错误

2015/06/17 15:14:51.476 [ERROR] [main] [com.alibaba.druid.pool.DruidDataSource.handleConnectionException(DruidDataSource.java:1193)]  discard connection
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during rollback(). Transaction resolution unknown.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	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.rollback(ConnectionImpl.java:4733)


由此断定是网络不稳定造成的,至于网络为什么不稳定就的找运维和运营商解决了,至少我能肯定的是我们公司的网络经常性的出现不稳定的情况,网络环境搭建的太复杂了(多个网络出口, 自己的DNS服务,楼上的,楼下的,各个网段,各种访问控制..........),积累了好多年的修改了,需要升级改造了!




你可能感兴趣的:(MySQL,Java,Error)