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

java.sql.SQLException:无法在全局事务中使用本地事务提交,java,transactions,sqlexception,distributed-transactions,xa,Java,Transactions,Sqlexception,Distributed Transactions,Xa,我们有两个oracle实例(两台物理机器)和一个应用程序模式。 我们正在使用weblogic应用服务器。应用程序使用为其启用XA事务的数据源 我有一个bean管理的EJB,我在那里- 更新表中的一些数据,然后提交 提交oracle作业 再次更新表中的一些数据,然后提交 这里我得到一个错误-java.sql.SQLException:无法在全局事务中使用本地事务提交 奇怪的是,这个错误并不是每次执行都提交,而是在7-8次执行中提交1次 现在我的问题是 若我使用启用XA的事务,bean管理的事务的意

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

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

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

    Connection.setAutoCommit(false)
    

    我猜您使用的是两阶段事务,如果您在第一步中没有提交该怎么办?

    我遇到了相同的问题,当我将本地事务设置为“自动提交错误”时,解决了该问题

    Connection.setAutoCommit(false)
    

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

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

  • 抛出一个异常,该异常取决于ejb jar.xml/weblogic ejb jar.xml,默认为事务标记为回滚的任何运行时异常

  • 在CheckedException情况下或需要时调用EJBContext.setRollbackOnly()方法

  • 如果同一事务下的所有资源均未发生上述情况,则事务管理器迟早会提交

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

    至于你的问题

  • 若我使用启用XA的事务,bean管理的事务的意义是什么

    如果ejb-jar.xml中的事务属性启用事务传播,则bean管理的事务是“全局事务”。全局事务需要数据源启用XA,即jdbc驱动程序本身是XA类驱动程序,如oracle.jdbc.XA.client.oraclexadasource,或启用XA的精简驱动程序oracle.jdbc.OracleDriver(模拟两阶段事务,但不是真实事务)

  • 为什么不是每次执行都会遇到这种情况

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


  • 我希望我的回答能有所帮助,祝你好运

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

  • 抛出一个异常,该异常取决于ejb jar.xml/weblogic ejb jar.xml,默认为事务标记为回滚的任何运行时异常

  • 在CheckedException情况下或需要时调用EJBContext.setRollbackOnly()方法

  • 如果同一事务下的所有资源均未发生上述情况,则事务管理器迟早会提交

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

    至于你的问题

  • 若我使用启用XA的事务,bean管理的事务的意义是什么

    如果ejb-jar.xml中的事务属性启用事务传播,则bean管理的事务是“全局事务”。全局事务需要数据源启用XA,即jdbc驱动程序本身是XA类驱动程序,如oracle.jdbc.XA.client.oraclexadasource,或启用XA的精简驱动程序oracle.jdbc.OracleDriver(模拟两阶段事务,但不是真实事务)

  • 为什么不是每次执行都会遇到这种情况

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


  • 我希望我的回答能有所帮助,祝你好运

    事务属性是什么?您在代码中调用了提交/回滚吗?提供您的代码,这应该是更清晰的代码添加,“事务属性”这里的“事务属性”是指XA数据源配置吗?不,在ejb-jar.xml中,容器事务->事务属性什么?您在代码中调用了提交/回滚吗?提供您的代码,这应该是更清晰的代码添加,“事务属性”你是指XA数据源配置吗?不,在ejb-jar.xml容器事务->trans AttributeThaks中,我将尝试这个,但你知道为什么它不会在每次执行中发生吗。此外,我还需要使用commit,因为无论接下来发生什么,我都必须保存一些数据。(检查点)。谢谢,我会尝试这个,但是您知道为什么它不会在每次执行中都发生吗。我还需要使用commit,b