天天看點

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