我的代码中有一个问题我正在使用服务器和客户端 session 对象。像这样
Session serverSession=HibernateUtilServer.getSession();
Session clientSession=HibernateUtilLocal.getSession();
//一些数据库操作....
serverSession.beginTransaction().commit();
clientSession.beginTransaction().commit();
但问题是 serverSession.beginTransaction().commit();
在这一行之后如果我遇到一些网络问题意味着一些异常。我无法提交我的 clientSession 数据,这没关系,这意味着我可以 clientSession.beginTransaction().rollBack();
。所以我想回滚 serverSession 数据还有如何做到这一点请帮助我..
注意:这里serverSession和clientSession的数据库连接不同,配置文件也不同 谢谢..
最佳答案
如果您运行本地事务,则每次请求 session 模式使用每个 session 一个 JDBC 连接。对于 JTA,连接在每个语句后被主动释放,只是为了下一个语句重新获取。
Hibernate 事务 API 将开始/提交/回滚委托(delegate)给本地事务的 JDBC 连接和 JTA 的关联 UserTransaction。因此,您可以在同一个 Hibernate Session 上运行多个事务,但有一个问题。一旦抛出异常,您就不能再重用该 session 。
我的建议是分而治之。只需拆分所有项目,为每个项目构建一个 Command 对象,然后将它们发送到 ExecutorService#invokeAll。使用返回的 List 迭代并调用 Future#get() 以确保原始线程在所有批处理作业完成后等待。
ExecutorService 将确保您同时运行所有命令,并且每个命令都应该使用一个使用自己的@Transaction 的服务。因为事务是线程绑定(bind)的,所以您将让所有批处理作业独立运行。
关于java - 如何在 hibernate 中处理多个 session 事务提交和回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49398934/