java - 如何在 hibernate 中处理多个 session 事务提交和回滚?

标签 java mysql hibernate jakarta-ee

我的代码中有一个问题我正在使用服务器和客户端 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/

相关文章:

java - Java初学者: what to download?

java - 如何在Spring上下文中注入(inject)回调类?

java - IntelliJ IDEA 中 Eclipse 的 Ctrl+O(显示大纲)快捷方式是什么?

mysql - Express View 引擎无法识别发送到前端的数据

java - org.hibernate.MappingException : Unknown entity on User object that contains Entity annotation

java - 在 boolean 数组中设置随机位索引(Java)

mysql - 简单的 mySQL 查询不使用索引

java - 如何在hibernate条件中使用mysql的 "use index()"子句?

java - 无法初始化 sessionFactory。 Spring hibernate 3

mysql - 我有一个 javax.persistence.TransactionRequiredException