gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:54:08 26 4
gpt4 key购买 nike

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

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

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

我需要在一个事务中完成一些更新/插入,所以这就是我正在做的:

  1. 在我的连接上将 autoCommit 设置为 false。
  2. 做我的插入(准备语句,执行查询)
  3. 调用commit。

在提交时,我得到一个 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 {
//.....
}

谢谢

最佳答案

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

如果它是一个独立的 JTA,获取 UserTransaction 并在那里调用开始和提交。如果它在应用程序服务器内,请使用事务注释或应用程序服务器为您提供的任何内容来管理事务。看this page了解它是如何在 JavaEE 6 中完成的。

如果您使用的是 Spring,您还可以使用事务注释将您的代码包装在一个事务中。 Here是相关文档。

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

关于java - JDBC 分布式事务和显式回滚/提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14158577/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com