Spring 中的并发事务和@TransactionalEventListener 顺序?
Concurrent transactions and @TransactionalEventListener order in Spring?
如果我有这样声明的方法:
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void afterTxCommit(MyObject myObject) {
....
}
鉴于有两个并发事务,T1
和 T2
,并且 T1
在 T2
之前(稍微)结束:
afterTxCommit
是否会在 T1
之前被同步调用 它会在默认 Spring 配置下被 T2
调用?
- 如果不是这种情况,您如何配置 Spring 以确保
afterTxCommit
保证以与事务提交相同的顺序同步执行?
- 没有。侦听器将在与事务相同的线程中被调用。因此,如果两个事务并发执行,它们的侦听器也会同时被调用。
- 如果定义此侦听器方法的 Spring bean 是单例,则将其设置为
synchronized
将确保该方法一次由一个线程执行,但是有不保证顺序:线程调度程序可能会选择在第一个事务的侦听器之前调用第二个事务的侦听器,即使第一个事务先提交。我很确定仅通过配置 Spring. 无法完成您想要的操作
这对我来说听起来像是一种设计味道:如果两个并发事务是并发的,那么它们应该是独立的,顺序应该无关紧要。但是,如果不知道您要实现的目标,就很难提出任何具体的建议。
如果我有这样声明的方法:
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void afterTxCommit(MyObject myObject) {
....
}
鉴于有两个并发事务,T1
和 T2
,并且 T1
在 T2
之前(稍微)结束:
afterTxCommit
是否会在T1
之前被同步调用 它会在默认 Spring 配置下被T2
调用?- 如果不是这种情况,您如何配置 Spring 以确保
afterTxCommit
保证以与事务提交相同的顺序同步执行?
- 没有。侦听器将在与事务相同的线程中被调用。因此,如果两个事务并发执行,它们的侦听器也会同时被调用。
- 如果定义此侦听器方法的 Spring bean 是单例,则将其设置为
synchronized
将确保该方法一次由一个线程执行,但是有不保证顺序:线程调度程序可能会选择在第一个事务的侦听器之前调用第二个事务的侦听器,即使第一个事务先提交。我很确定仅通过配置 Spring. 无法完成您想要的操作
这对我来说听起来像是一种设计味道:如果两个并发事务是并发的,那么它们应该是独立的,顺序应该无关紧要。但是,如果不知道您要实现的目标,就很难提出任何具体的建议。