我们有两个 oracle 实例(两台物理机器)和一个用于我们的应用程序的模式。我们正在使用 weblogic 应用程序服务器。应用程序使用启用了 XA 事务的数据源。
我有一个 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();
这里需要第一次提交,因为我想保存调用期间使用的参数,即使作业提交失败。(或前面的任何事情。)