一.properties配置文件(數據庫相關配置省略)
#------------------------事務相關配置---------------------------# transactional.method.required=save*,delete*,update*,exec*,set*,insert*,add*,imp* transactional.method.readOnly=get*,query*,find*,select*,list*,is*,count*
二.配置類 OssTransactionAdviceConfiguration
/** * @author wen.jie * @Classname OssTransactionAdviceConfiguration * @Description Oss全局事務控制 * @Date 2020/7/11 * 參考:https://www.cnblogs.com/hnusthuyanhua/p/11796365.html */ @Component @Aspect public class OssTransactionAdviceConfiguration { @Autowired private TransactionManager transactionManager; //指定事務處理范圍 private static final String POINTCUT_EXPRESSION = "execution(* com.topcheer..service..*(..))"; ////////////////////--------從properties中讀取相關配置-------///////////////////////////// @Value("#{'${transactional.method.required}'.split(',')}") private List<String> requiredList; @Value("#{'${transactional.method.readOnly}'.split(',')}") private List<String> readOnlyList; @Bean public TransactionInterceptor txAdvice() { DefaultTransactionAttribute txAttr_REQUIRED = new DefaultTransactionAttribute(); txAttr_REQUIRED.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); DefaultTransactionAttribute txAttr_REQUIRED_READONLY = new DefaultTransactionAttribute(); txAttr_REQUIRED_READONLY.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); txAttr_REQUIRED_READONLY.setReadOnly(true); NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource(); Map<String,TransactionAttribute> nameMap = new LinkedHashMap<>(); requiredList.forEach(r->nameMap.put(r,txAttr_REQUIRED)); readOnlyList.forEach(r->nameMap.put(r,txAttr_REQUIRED_READONLY)); source.setNameMap(nameMap); return new TransactionInterceptor(transactionManager, source); } @Bean public Advisor txAdviceAdvisor() { AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); pointcut.setExpression(POINTCUT_EXPRESSION); return new DefaultPointcutAdvisor(pointcut, txAdvice()); } }
三.測試
@Service public class UserService { @Autowired private UserMapper userMapper; public void insertTest(){ List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("rid",3)); User user = new User(); user.setAccount("asdasd"); user.setPassword("asasa"); user.setRid(3); user.setUid(100); userMapper.insert(user); int a = 1/0; } }
測試結果:
數據庫並沒有插入對應數據,事務回滾了。