我的代码中有一个问题我正在使用服务器和客户端会话obj。像这样
Session serverSession=HibernateUtilServer.getSession();
Session clientSession=HibernateUtilLocal.getSession();
//这里有一些数据库操作....
serverSession.beginTransaction().commit();
clientSession.beginTransaction().commit();
但问题是serverSession.beginTransaction().commit();
在此行之后如果我遇到一些网络问题意味着一些异常。我无法提交我的clientSession数据这没关系意味着我可以clientSession.beginTransaction().rollBack();
。所以我想rollBack serverSession数据也如何做到这一点请帮帮我..
注意:这里serverSession和clientSession都有不同的数据库连接和不同的配置文件 谢谢..
答案 0 :(得分:2)
如果运行本地事务,则每个会话的会话模式会在每个会话中使用一个JDBC连接。对于JTA,只有在下一个语句重新获取时才会在每个语句之后积极地释放连接。
Hibernate事务API将begin / commit / rollback委托给本地事务的JDBC Connection以及JTA的相关UserTransaction。因此,您可以在同一个Hibernate会话上运行多个事务,但是有一个问题。抛出异常后,您将无法再重用该会话。
我的建议是分而治之。只需拆分所有项目,为每个项目构造一个Command对象,并将它们发送到ExecutorService#invokeAll。使用返回的List迭代并调用Future#get()以确保原始线程在所有批处理作业完成后等待。
ExecutorService将确保您同时运行所有命令,并且每个Command应使用使用其自己的@Transaction的服务。由于事务是线程绑定的,因此您将使所有批处理作业独立运行。
答案 1 :(得分:1)
这取决于使用hibernate&弹簧。我看到你使用了非常好的框架。它已经拥有非常好的交易管理支持。我建议你不要手动做这件事。使用其核心交易支持。举个例子: 您在方法级别,类级别等标记的@Transaction批注,请阅读它的工作原理!!你会得到更好的主意。
参考链接:https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html
修改强> 如果你不使用spring,那么你需要捕获异常。你需要在那里回滚交易。如果要添加框架层,则添加supper类或常用方法以回滚事务。调用catch块。