Spring中的并发事务和@TransactionalEventListener命令?

时间:2016-04-13 09:32:17

标签: spring spring-transactions

如果我有一个像这样声明的方法:

.xml

鉴于有两个并发交易,@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) public void afterTxCommit(MyObject myObject) { .... } T1以及T2T1之前(稍微)结束:

  1. 在使用默认的Spring配置为T2调用之前,afterTxCommit 会同步调用T1吗?
  2. 如果不是这种情况,您如何配置Spring以确保{I}保证以与提交事务相同的顺序同步执行?

1 个答案:

答案 0 :(得分:1)

  1. 否。将在与事务相同的线程中调用侦听器。因此,如果两个事务同时执行,它们的侦听器也将同时调用。
  2. 如果定义了这个侦听器方法的Spring bean是一个单例,那么使它成为synchronized将确保该方法一次只能由一个线程执行,但是不能保证顺序:线程调度程序可能会选择在第一个事务的侦听器之前调用第二个事务的侦听器,即使第一个事务首先提交。我非常确定只需配置Spring就无法做到你想做的事。
  3. 这听起来像是一种设计气味:如果两个并发事务是并发的,那么它们应该是独立的,并且顺序不重要。但是在不知道你想要实现的目标的情况下,很难提出具体的建议。