仅在确定提交但在提交之前拦截事务

m3t*_*man 16 java spring jpa transactions spring-transactions

Context是Java - 带有Hibernate和Spring的JPA.

我们来看两阶段提交协议的场景(但只有一个资源):

  1. 查询从应用程序提交

  2. 投票是/否(在我们的案例中来自数据库)

3.1.如果是,来自数据库

3.1.1.(在代码中进行回调) - 不是协议的一部分

3.1.2.提交数据库

3.2如果没有

3.2.1回滚到数据库

我想要的是一种在代码中从3.1.1进行回调的方法,但只有当知道事务将被提交但在实际提交之前.此外,如果在此处抛出异常,则应回滚该事务.

使用TransactionSynchronizationSpring中的(*),允许您在事务提交/完成之前或提交/完成之后拦截事务.

  • beforeCommit() 回调说在调用方法后仍然可以发生回滚;
  • beforeComplete() 即使交易失败也会被调用
  • afterCommit/Complete() 在事务实际提交到数据库之后调用,并且无法回滚.

现在我看起来似乎我想要的是另一个完整的两阶段提交协议; 但我想知道Spring中是否有解决方法.区别在于回调中完成的调用无法回滚.

来自Spring 4.2的(*)非常简单,@TransactionalEventListener并且TransactionPhase很好地抽象TransactionSynchronization

小智 1

您的情况是您的资源之一与两阶段提交不兼容(不支持 XA)。您的想法遵循 XA 段和http://www.javaworld.com/article/2077963/open-source-tools/distributed-transactions-in-spring--with-最后资源策略中描述的模式的方向and-without-xa.html

如何设置 Spring Boot + Bitronix + non-XA Datasource + XA JMS Connection 的答案中简要解释了最后一个资源策略的使用

顺便说一句,您的问题没有提及您使用的事务管理器的实现(JBossTS、Bitronix JTA、Atomikos Transaction Essentials,...)。