アプリケーション用に、2つのoracleインスタンス(2つの物理マシン)と1つのスキーマがあります。weblogicアプリケーションサーバーを使用しています。アプリケーションは、XAトランザクションが有効になっているデータソースを使用します。
私は1つのBeanマネージドEJBを持っていますが、ここで-
- テーブル内のいくつかのデータを更新してからコミットします
- Oracleジョブを送信する
- テーブル内のデータを再度更新してからコミットします
ここでエラーが発生します-java.sql.SQLException:グローバルトランザクションでローカルトランザクションコミットを使用できませんでした。
奇妙なことに、このエラーはすべての実行で発生するわけではなく、7〜8回の実行で1回発生します。
今私の質問は
- XA対応のトランザクションを使用する場合、Bean管理のトランザクションの重要性は何ですか?
- なぜそれはすべての実行で遭遇しないのですか?
ありがとう。
以下はコードです-
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();
ここでは、ジョブの送信が失敗した場合でも、呼び出し中に使用されるパラメーターを保存したいので、最初のコミットが必要です。