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



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

该项目正在使用Hibernate,但由于一些历史原因,我正在研究的部分使用JDBC,并且需要保持这种方式。

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

我需要在一个事务中封装一些更新/插入,所以我正在做的是:

  1. 在我的连接上设置autoCommit为false
  2. 执行insert(准备语句,执行查询)
  3. 调用提交。

在提交时,我得到一个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。如果它位于应用服务器中,则使用事务注释或应用服务器提供的任何内容来管理事务。请看这一页,了解在JavaEE 6中是如何实现的。

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

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

最新更新