2013-03-19 45 views
1

我們有兩個oracle (兩臺物理機)的實例以及我們的應用程序的一個模式。 我們使用的是weblogic應用程序服務器。應用程序使用啓用了XA事務的數據源。java.sql.SQLException:無法在全局事務中使用本地事務提交

我有一個Bean管理EJB,我在那裏做 -

  1. 更新一些數據表,然後提交
  2. 提交Oracle作業
  3. 再次更新表中的一些數據,然後提交

這裏我得到錯誤 - java.sql.SQLException:不能在全局事務中使用本地事務提交。

奇怪的是,這個錯誤並不是在每次執行時都進行交換,它在7-8次執行中正在執行1次。

現在我的問題是

  1. 是什麼,如果我使用支持XA交易bean的意義管理的事務?
  2. 爲什麼它在每次執行中都沒有遇到?

謝謝。

下面

是代碼 -

DataObject.updateDataAndReturnCount(" UPDATE EOD_Trn_BatchProcess SET iJobNo = ?, szParameters = ? WHERE iProcessSeqNo = ? ", conn, new String[]{null, strParameters, (String)mapParameters.get("__PROCESS_SEQ_NO")}); 
conn.commit(); 

String strStatement = "{? = call submitProcAsJob(?, ?)}"; 
//String strStatement = "begin ? := submitProcAsJob(?, ?); end;"; 
CallableStatement pStmt = conn.prepareCall(strStatement); 
pStmt.registerOutParameter(1, OracleTypes.NUMBER); 
pStmt.setObject(2, strJobName); 
pStmt.setObject(3, strInstanceNo); 
pStmt.execute(); 
vString strJobNo = pStmt.getString(1); 
vpStmt.close(); 

DataObject.updateData(" UPDATE EOD_Trn_BatchProcess SET iJobNo = ?, szParameters = ? WHERE iProcessSeqNo = ? ", conn, new String[]{strJobNo, strParameters, (String)mapParameters.get("__PROCESS_SEQ_NO")}); 
conn.commit(); 

這裏第一次提交要求,因爲我要保存通話過程中使用的參數,即使作業提交失敗

+0

什麼是事務屬性?你在代碼中調用了提交/回滾嗎?提供你的代碼,那應該更清楚 – 2013-03-20 01:49:48

+0

代碼的加入,這個「事務屬性」是否代表XA數據源的配置? – JackNJill 2013-03-20 14:02:28

+0

不,在ejb-jar.xml中,container-transaction-> trans-attribute – 2013-03-21 02:48:29

回答

0

我已經(或提前任何東西。)遇到同樣的問題,並且當我設置本地事務爲自動提交錯誤時解決了問題。

Connection.setAutoCommit(false) 

我猜你使用的是2短語交易,如果你沒有在你犯了什麼第一步?

+0

謝謝,我會試試這個,但是你知道爲什麼它不會在每次執行中發生。另外我需要使用提交,因爲我必須保存一些數據並不重要,接下來會發生什麼(檢查點)。 – JackNJill 2013-03-20 14:08:34

0

的原因的例外是,你不能mannaully調用commit在全局事務()/回滾,可以只標明它rollback.You有三種選擇:

  1. 拋出異常,這取決於ejb-jar.xml/weblogic-ejb-jar.xml,缺省情況是針對任何RuntimeException事務標記爲回滾;

  2. 在CheckedException或需要時調用EJBContext.setRollbackOnly()方法;

  3. 如果在同一事務下沒有上述情況發生,它將由事務管理器遲早提交。

事務管理器負責提交()/回滾()爲您的交易,使之有機會與 不同的資源(二ORALCE數據庫爲例)合作。您可以通過gooble檢查細節的關鍵詞「兩個階段交易」或「全球事務」,這裏是我發現: Global Transaction

至於你的問題

  1. 什麼是bean的意義管理交易,如果我使用XA啓用交易?

    如果ejb-jar.xml中的事務屬性啓用事務傳播,則Bean管理的事務是「全局事務」。全局事務需要將數據源啓用XA,即jdbc驅動程序本身是XA類驅動程序,如oracle.jdbc.xa.client.OracleXADataSource,或啓用XA的瘦驅動程序oracle.jdbc.OracleDriver(模擬兩個分階段交易,但不是真正的交易)

  2. 爲什麼它在每次執行中都沒有遇到?

    我不知道爲什麼,我想司機有一定的機制來檢查是否該裁定是breaked.Or的事務屬性配置爲支持,因此,如果調用者有一個事務上下文,那麼你的EJB是全球交易,否則不是。

我希望我的回答有幫助,祝你好運!