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