如何在休眠中处理多个会话事务提交和回滚?

Posted

技术标签:

【中文标题】如何在休眠中处理多个会话事务提交和回滚?【英文标题】:How to handle multiple session tranaction commit and rollback in hibernate? 【发布时间】:2018-08-30 03:16:11 【问题描述】:

我的代码中有一个问题,我正在使用服务器和客户端会话 obj。像这样

Session serverSession=HibernateUtilServer.getSession();
Session clientSession=HibernateUtilLocal.getSession();

//这里有一些数据库操作....

serverSession.beginTransaction().commit();
clientSession.beginTransaction().commit();

但问题是serverSession.beginTransaction().commit(); 如果我遇到一些网络问题,则在此行之后意味着一些异常。我无法提交我的 clientSession 数据,这没关系,这意味着我可以clientSession.beginTransaction().rollBack();。所以我想回滚 serverSession 数据也如何做到这一点请帮助我..

注意:这里serverSession和clientSession都有不同的数据库连接和不同的配置文件 谢谢你。。

【问题讨论】:

【参考方案1】:

如果您运行本地事务,则每个请求的会话模式每个会话使用一个 JDBC 连接。对于 JTA,连接会在每个语句之后积极释放,只是为了在下一个语句中重新获取。

Hibernate 事务 API 将 begin/commit/rollback 委托给本地事务的 JDBC Connection 和 JTA 的关联 UserTransaction。因此,您可以在同一个 Hibernate Session 上运行多个事务,但有一个问题。一旦抛出异常,您就不能再重用该 Session。

我的建议是分而治之。只需拆分所有项目,为每个项目构造一个 Command 对象并将它们发送到 ExecutorService#invokeAll。使用返回的 List 进行迭代并调用 Future#get() 以确保原始线程在所有批处理作业完成后等待。

ExecutorService 将确保您同时运行所有命令,并且每个命令都应该使用一个使用自己的@Transaction 的服务。因为事务是线程绑定的,所以所有批处理作业都将单独运行。

【讨论】:

您可以添加评论的来源。【参考方案2】:

这取决于休眠和弹簧的使用。我看到你使用了非常好的框架。它已经有很好的事务管理支持。我建议您不要手动执行此操作。使用其核心事务支持。举个例子: 您在方法级别、类级别等标记的@Transaction 注释只需阅读它是如何工作的!你会得到更好的主意。

参考链接:https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html

编辑 如果您不使用弹簧,那么您需要捕获异常。你需要在那里回滚事务。如果要添加框架层,请添加超级类或常用方法来回滚事务。调用 catch 块。

【讨论】:

感谢您的回复。但我没有使用spring框架

以上是关于如何在休眠中处理多个会话事务提交和回滚?的主要内容,如果未能解决你的问题,请参考以下文章

在只有选择的事务中提交和回滚之间有区别吗?

什么是事务事务中的提交和回滚是什么意思

mysql事务的提交和回滚

如何使用 codeigniter 中的事务进行基于数据更改的提交和回滚?

休眠(mysql)刷新与提交中的自动增量

单个休眠会话中的多个事务(使用 Spring)