简介
本文介绍@Transactional 和 @Cacheable标注在同一个方法上时的执行顺序。
简述
如果一个方法上同时存在 @Transactional 和 @Cacheable ,且没有指定事务切面和缓存切面的 Order,那么先执行 @Cacheable 对应的切面,再执行 @Transactional 对应的切面。
详解
Spring里如果一个方法存在多个切面,是按照切面的 Order 顺序来执行的:Order 值越小,那么切面越先执行(越后结束)。
@Transactional 和 @Cacheable 都是通过 AOP 来实现的,@Transactional 和 @Cacheable分别对应了一个切面。
- 如果不指定事务切面和缓存切面的 Order,它们的 Order 都将是默认值(Integer.MAX_VALUE),即最小优先级。
- 如果两个切面 Order 相同,按照切面的字母顺序来执行。
所以:如果一个方法上同时存在 @Transactional(对应切面为 TransactionInterceptor)和 @Cacheable (对应切面为 CacheInterceptor),且没有指定事务切面和缓存切面的 Order。那么因为 CacheInterceptor 的字母顺序在 TransactionInterceptor 之前,所以先执行 @Cacheable 对应的切面,再执行 @Transactional 对应的切面。
那么如何指定缓存切面或者事务切面的 Order ?
使用注解:
@EnableCaching(order = 1) @EnableTransactionManagement(order = 2)
请先
!