1

我们有两个 oracle 实例(两台物理机器)和一个用于我们的应用程序的模式。我们正在使用 weblogic 应用程序服务器。应用程序使用启用了 XA 事务的数据源。

我有一个 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();

这里需要第一次提交,因为我想保存调用期间使用的参数,即使作业提交失败。(或前面的任何事情。)

4

2 回答 2

1

异常的原因是你不能在全局事务下手动调用commit()/rollback,你只能将它标记为rollback。你有三个选项:

  1. 抛出异常,这取决于ejb-jar.xml/weblogic-ejb-jar.xml,默认是针对任何RuntimeException事务标记为回滚;

  2. 在发生 CheckedException 或需要时调用 EJBContext.setRollbackOnly() 方法;

  3. 如果同一事务下的所有资源都没有发生上述情况,事务管理器迟早会提交。

事务管理器负责为您提交()/回滚()事务,以便它有机会与不同的资源(例如两个 oralce db)合作。您可以通过谷歌关键字查看详细信息“两阶段交易”或“全球交易”,这是我发现的: 全球交易

至于你的问题

  1. 如果我使用启用 XA 的事务,bean 管理的事务有什么意义?

    如果 ejb-jar.xml 中的事务属性启用事务传播,则 bean 管理的事务是“全局事务”。全局事务需要数据源启用XA,即jdbc驱动本身是XA类驱动,如oracle.jdbc.xa.client.OracleXADataSource,或者启用XA的瘦驱动oracle.jdbc.OracleDriver(模拟两个分阶段交易,但不是真正的交易)

  2. 为什么每次执行都没有遇到?

    我不知道为什么,我猜驱动程序有一些机制来检查规则是否被打破。或者事务属性配置为支持,所以如果调用者有事务上下文,那么你的 ejb 是在全局事务下,否则不是。

希望我的回答对您有所帮助,祝您好运!

于 2013-03-21T02:05:58.740 回答
0

我遇到了同样的问题,当我将本地事务设置为自动提交 false 时解决了这个问题。

Connection.setAutoCommit(false)

我猜您正在使用两阶段事务,如果您在第一步中不提交怎么办?

于 2013-03-19T14:31:53.003 回答