Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC分布式事务和显式回滚/提交_Java_Jdbc_Transactions_Rollback_Distributed Transactions - Fatal编程技术网

Java JDBC分布式事务和显式回滚/提交

Java JDBC分布式事务和显式回滚/提交,java,jdbc,transactions,rollback,distributed-transactions,Java,Jdbc,Transactions,Rollback,Distributed Transactions,我正在处理一个为分布式事务配置的现有项目 该项目使用Hibernate,但由于某些历史原因,我正在处理的部分使用JDBC,需要保持这种方式 为了获得连接,我必须调用一个API,它返回hibernate会话的JDBC连接 我需要在一个事务中完成一些更新/插入,下面是我要做的: 在我的连接中将自动提交设置为false 执行我的插入(准备语句、执行查询) 呼叫提交 在提交时,我得到一个SQLException,因为显然不允许使用分布式事务显式地调用提交/回滚。我应该声明,将数据源配置更改为非XA不是一

我正在处理一个为分布式事务配置的现有项目

该项目使用Hibernate,但由于某些历史原因,我正在处理的部分使用JDBC,需要保持这种方式

为了获得连接,我必须调用一个API,它返回hibernate会话的JDBC连接

我需要在一个事务中完成一些更新/插入,下面是我要做的:

  • 在我的连接中将自动提交设置为false
  • 执行我的插入(准备语句、执行查询)
  • 呼叫提交
  • 在提交时,我得到一个SQLException,因为显然不允许使用分布式事务显式地调用提交/回滚。我应该声明,将数据源配置更改为非XA不是一个选项

    你知道我该怎么做吗

            connexionDiff.setAutoCommit(false); 
            psInsertLiv = connexionDiff.prepareStatement(reqInsertLivraison);
            psInsertLivHisto = connexionDiff.prepareStatement(reqInsertLivraisonHisto);
            psSequence = connexionDiff.prepareStatement(reqCleLivraison);
    
            ps = connexionDiff.prepareStatement(requeteRelivraison);
            rs = ps.executeQuery();
    
            while(rs.next()) {
    
                rsSequence = psSequence.executeQuery();
                while ( rsSequence.next() ) {
                    sequenceLivraison = rsSequence.getInt(1);
                }
    
                psInsertLiv.setInt(1, sequenceLivraison);
                psInsertLiv.setInt(2, rs.getInt(1));
                psInsertLiv.executeUpdate();
    
                psInsertLivHisto.setInt(1, sequenceLivraison);
                psInsertLivHisto.setInt(2, rs.getInt(1));
                psInsertLivHisto.executeUpdate();
    
                connexionDiff.commit();
            }
    
        } catch (SQLException ex) {
           try{
            connexionDiff.rollback();
          }catch {
    //......
    }
        } finally {
            //.....
        }
    

    Thx

    当您使用XA连接时,您肯定是在使用JTA管理事务

    如果它是一个独立的JTA,那么获取UserTransaction并在那里调用begin和commit。如果它位于应用服务器内部,请使用事务注释或应用服务器提供的任何内容来管理事务。查看以了解在JavaEE6中是如何实现的

    如果您使用的是Spring,那么还可以使用事务性注释将代码包装到事务中。是相关的文件


    无论您使用的是Hibernate还是普通JDBC,事务管理都应该是相同的。因此,请检查在您的项目中使用Hibernate时是如何完成的,并遵循相同的步骤。

    问题是,由于用于将使用jdbc的部件调整为Hibernate的遗留API层的限制,我只有jdbc连接对象的句柄。很抱歉,我的回复太晚了。是的,代码在同一台服务器中运行。