【发布时间】:2017-01-08 06:36:20
【问题描述】:
上下文是 Java - 带有 Hibernate 和 Spring 的 JPA。
让我们以两阶段提交协议的场景为例(但只有一个资源):
从应用程序提交的查询
投票是/否(在我们的案例中来自数据库)
3.1。如果是来自数据库
3.1.1。 (在代码中进行回调) - 不是协议的一部分
3.1.2。提交到数据库
3.2 如果没有
3.2.1 回滚到数据库
我想要的是一种在代码中从 3.1.1 进行回调的方法,但前提是知道事务将被提交,但实际上是在之前提交的。另外,如果这里抛出异常,那么事务应该被回滚。
使用 Spring 中的 TransactionSynchronization (*),允许您在事务提交/完成之前或提交/完成之后拦截事务。
-
beforeCommit()回调表示调用方法后仍然可以发生回滚; -
即使事务失败也会调用
beforeComplete() -
afterCommit/Complete()在事务实际提交到数据库后调用,无法回滚。
现在看来,我想要的是另一个完整的两阶段提交协议;但我想知道 Spring 是否有解决方法。不同的是,回调中完成的调用不能回滚。
(*) 来自 Spring 4.2 的 @TransactionalEventListener 和 TransactionPhase 非常简单,它们很好地抽象了 TransactionSynchronization
【问题讨论】:
-
您是否在尝试模仿两阶段提交?你试过
<tx:jta-transaction-manager/>吗?它在春季提供两阶段提交。 -
@Zeus 是的,但不完全;在回调方法中完成的调用不应该也不能回滚。将看看 JtaTransactionManager。不用说回调只是代码回调,不是完全实现 XA 的资源。
-
您是否考虑过使用 Spring PlatformTransactionManager?查看 Spring 文档,这是一个您可以实现和传递的接口。
-
@JohnHarris 我希望在不需要实施的情况下获得现有的支持;但连接到现有框架总比没有好。
标签: java spring jpa transactions spring-transactions