天天看点

websphere错误备忘录

项目已经上线,昨天客户发现一个问题,某个操作取消不了,查看一下log,系统是websphere5.x,发现以下的异常:

e wltc0033e: 在清除未解析 localtransactioncontainment 时,资源 jdbc/oa回滚。

[07-1-15 17:37:09:280 cst] 57961377 localtrancoor e wltc0032e: 一个或多个资源回滚。一个未解析的 localtransactioncontainment 有一个未解析的回滚操作。

[07-1-15 17:37:09:280 cst] 57961377 webapptransac e wtrn0043i: 由于 setrollbackonly,本地事务回滚。

[07-1-15 17:37:09:296 cst] 57961377 webgroup      e srve0026e: [servlet 错误]-[localtransaction rolled-back due to setrollbackonly]:com.ibm.ws.localtransaction.rolledbackexception

    at com.ibm.ws.localtransaction.localtrancoordimpl.cleanup(localtrancoordimpl.java(compiled code))

    at com.ibm.ws.webcontainer.webapp.webapptransactioncollaborator.postinvoke(webapptransactioncollaborator.java(compiled code))

    at com.ibm.ws.webcontainer.webapp.webapprequestdispatcher.dispatch(webapprequestdispatcher.java(compiled code))

    at com.ibm.ws.webcontainer.webapp.webapprequestdispatcher.forward(webapprequestdispatcher.java(compiled code))

    at com.ibm.ws.webcontainer.srt.webappinvoker.doforward(webappinvoker.java(compiled code))

    at com.ibm.ws.webcontainer.srt.webappinvoker.handleinvocationhook(webappinvoker.java(compiled code))

    at com.ibm.ws.webcontainer.cache.invocation.cachedinvocation.handleinvocation(cachedinvocation.java(compiled code))

    at com.ibm.ws.webcontainer.cache.invocation.cacheableinvocationcontext.invoke(cacheableinvocationcontext.java(compiled code))

    at com.ibm.ws.webcontainer.srp.servletrequestprocessor.dispatchbyuri(servletrequestprocessor.java(compiled code))

    at com.ibm.ws.webcontainer.oselistener.oselistenerdispatcher.service(oselistener.java(compiled code))

    at com.ibm.ws.webcontainer.http.httpconnection.handlerequest(httpconnection.java(compiled code))

    at com.ibm.ws.http.httpconnection.readandhandlerequest(httpconnection.java(compiled code))

    at com.ibm.ws.http.httpconnection.run(httpconnection.java(compiled code))

    at com.ibm.ws.util.threadpool$worker.run(threadpool.java(compiled code))

查了下代码,一开始没发现有什么问题,不过是4,5个增删操作(两张表以上)。把错误信息输入google搜索,挺多人碰到这个错误,有的说是websphere的bug,有的说要把autocommit设置为true.

websphere的事务处理确实有bug,不过我们已经打过补丁,把autocommit设置为true的话,与我们所需要的效果不同,毕竟需要这些操作在同一个事务内。昨天查了一个晚上没找到原因,今天一段一段地调试代码,让我发现问题了:

conn = connectionmanager.getconnection();

conn.setautocommit(false);

在conn.commit()前,我进行了一个判断:

if(....){

  return;

}

conn.commit

直接return,导致后面的conn.commit()没有执行,事务不完整。修改成:

  ...

  conn.commit();

所以这个异常的出现,很有可能是你的事务处理有问题,那条教训还是很有用的:一个方法最好不要有多个return语句。

文章转自庄周梦蝶  ,原文发布5.16