Spring AOP注解处理顺序:@Transactional与@SchedulerLock谁先执行?
@Transactional与@SchedulerLock的执行顺序分析
这两个注解的执行顺序并非随机,而是由它们对应的Spring AOP切面的优先级(@Order值)决定的,和注解在方法上的书写顺序无关。
- 核心逻辑:Spring AOP中,切面的
@Order值越小,优先级越高,会先执行环绕通知的前置逻辑,后执行后置逻辑。 @Transactional的默认切面优先级是Integer.MAX_VALUE(最低优先级),Spring设计它为最低优先级,是为了让事务能包裹住所有其他切面的业务逻辑。@SchedulerLock(以Redisson实现为例)的默认切面优先级通常是-1(远高于事务切面),所以默认情况下会先执行锁的获取逻辑,再开启事务,执行完业务后先提交事务,再释放锁。
如果需要明确控制顺序,建议手动指定切面的优先级:
- 若要确保锁在事务前执行,给
SchedulerLock的切面设置比Integer.MAX_VALUE小的@Order值(比如@Order(1))。 - 若特殊场景需要先开事务再锁,调整事务切面的
@Order值为更小的数值(不推荐,可能引发并发事务问题)。
注意:如果先开启事务再获取锁,可能出现多个线程同时进入事务,之后才竞争锁的情况,容易导致脏数据或事务回滚异常,通常推荐先锁后事务的顺序。
内容的提问来源于stack exchange,提问作者Oleg
相关产品推荐
相关产品推荐

