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

3
我正在处理一个已配置为分布式事务的项目。 该项目使用Hibernate,但由于历史原因,我要处理的部分使用JDBC,并且需要保持这种方式。 为了获取连接,我必须调用一个API,该API会返回Hibernate Session的JDBC连接。 我需要将一些更新/插入封装在一个事务中,下面是我的步骤: 1.在连接上将autoCommit设置为false。 2.执行插入操作(准备语句、执行查询)。 3.调用commit。 在执行commit时,我会得到一个SQLException,因为显然不能使用分布式事务明确地调用commit/rollback。我应该指出,将数据源配置更改为非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

1个回答

3

由于您正在使用XA连接,因此您肯定正在使用JTA管理事务。

如果是独立的JTA,请获取UserTransaction并在那里调用begin和commit。如果它位于应用程序服务器内部,请使用事务注释或应用程序服务器提供的任何内容来管理事务。请参考this page 以了解JavaEE 6中如何实现。

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

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


问题在于,由于遗留API层的限制,我只有一个jdbc连接对象的句柄,用于适配使用jdbc到Hibernate的部分。 - Sandy
抱歉回复晚了,卢西亚诺。是的,代码在同一台服务器内运行。 - Sandy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接