所有分类
  • 所有分类
  • 未分类

SpringBoot–@Transactional 和 @Cacheable的执行顺序

简介

本文介绍@Transactional 和 @Cacheable标注在同一个方法上时的执行顺序。

简述

如果一个方法上同时存在 @Transactional 和 @Cacheable ,且没有指定事务切面和缓存切面的 Order,那么先执行 @Cacheable 对应的切面,再执行 @Transactional 对应的切面。

详解

Spring里如果一个方法存在多个切面,是按照切面的 Order 顺序来执行的:Order 值越小,那么切面越先执行(越后结束)。

@Transactional 和 @Cacheable 都是通过 AOP 来实现的,@Transactional 和 @Cacheable分别对应了一个切面。

  1. 如果不指定事务切面和缓存切面的 Order,它们的 Order 都将是默认值(Integer.MAX_VALUE),即最小优先级。
  2. 如果两个切面 Order 相同,按照切面的字母顺序来执行。

所以:如果一个方法上同时存在 @Transactional(对应切面为 TransactionInterceptor)和 @Cacheable (对应切面为 CacheInterceptor),且没有指定事务切面和缓存切面的 Order。那么因为 CacheInterceptor 的字母顺序在 TransactionInterceptor 之前,所以先执行 @Cacheable 对应的切面,再执行 @Transactional 对应的切面。

那么如何指定缓存切面或者事务切面的 Order ?

使用注解:

@EnableCaching(order = 1)
@EnableTransactionManagement(order = 2)
0

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录