m3t*_*man 16 java spring jpa transactions spring-transactions
Context是Java - 带有Hibernate和Spring的JPA.
我们来看两阶段提交协议的场景(但只有一个资源):
查询从应用程序提交
投票是/否(在我们的案例中来自数据库)
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,...)。
| 归档时间: |
|
| 查看次数: |
933 次 |
| 最近记录: |