首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.sql.SQLException:无法在全局事务中使用本地事务提交

java.sql.SQLException:无法在全局事务中使用本地事务提交
EN

Stack Overflow用户
提问于 2013-03-19 14:03:20
回答 2查看 6.7K关注 0票数 1

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

我有一个bean管理的EJB,在那里我做-

  1. 更新表中的一些数据,然后提交
  2. 提交甲骨文作业
  3. 再次更新表中的一些数据,然后提交

在这里,我得到了错误- java.sql.SQLException:无法在全局事务中使用本地事务提交。

奇怪的是,这个错误并不是每次执行都会发生,而是在7-8次执行中执行1次.

现在我的问题是

  1. 如果我使用XA启用的事务,bean管理事务的意义是什么?
  2. 为什么不是每次执行都遇到这种情况?

谢谢。

下面是代码-

代码语言:javascript
复制
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();

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

EN

回答 2

Stack Overflow用户

发布于 2013-03-21 02:05:58

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

  1. 抛出一个依赖于ejb-jar.xml/weblogic-ejb-jar.xml的异常,默认情况是事务标记为回滚的任何RuntimeException;
  2. 在EJBContext.setRollbackOnly()方法的情况下或在需要时调用CheckedException ()方法;
  3. 如果在同一事务下的所有资源都没有发生上述情况,事务管理器迟早会执行该操作。

事务管理器为您负责提交()/rollback()事务,以便它有机会与不同的资源(例如两个oralce db )合作,.You可以通过gooble检查细节--关键词是“两个分阶段事务”或“全局事务”,下面是我发现的:全局事务

至于你的问题

  1. 如果我使用XA启用的事务,bean管理事务的意义是什么? 如果ejb-jar.xml中的事务属性启用事务传播,那么bean管理的事务就是“全局事务”。全局事务需要启用XA数据源,即jdbc驱动程序本身是XA类驱动程序,如oracle.jdbc.xa.client.OracleXADataSource,或瘦驱动程序oracle.jdbc.OracleDriver (模拟两个阶段的事务,但不是真实的事务)。
  2. 为什么不是每次执行都遇到这种情况? 我不知道为什么,我猜驱动程序有一些机制来检查被裁定的事务属性是否是breaked.Or事务属性配置为支持,所以如果调用者有事务上下文,那么您的ejb处于全局事务之下,否则就不会。

祝我的回答有帮助,祝你好运!

票数 1
EN

Stack Overflow用户

发布于 2013-03-19 14:31:53

我也遇到过同样的问题,当我将本地事务设置为自动提交假时,问题就解决了。

代码语言:javascript
复制
Connection.setAutoCommit(false)

我想您使用的是一个2阶段的事务,如果您在第一步中不提交怎么办?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15501655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档