我的代码中有一个问题,我正在使用服务器和客户端会话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都具有不同的数据库连接和不同的配置文件
谢谢..

最佳答案

如果您运行本地事务,则每个请求会话模式将在每个会话中使用一个JDBC连接。对于JTA,每个语句之后都会主动释放连接,仅在下一个语句重新获得连接。

Hibernate事务API将begin / commit / rollback委派给JDBC Connection(用于本地事务)和关联的UserTransaction(用于JTA)。因此,您可以在同一个Hibernate Session上运行多个事务,但是有一个陷阱。引发异常后,您将无法再使用该Session。

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

ExecutorService将确保您同时运行所有Command,并且每个Command应该使用使用其自身@Transaction的Service。因为事务是线程绑定的,所以您将使所有批处理作业独立运行。

10-01 20:29
查看更多