Spring Boot:开启全局事务
一.properties配置文件(数据库相关配置省略)
1 2 3 | #------------------------事务相关配置---------------------------# transactional.method.required=save*,delete*,update*,exec*,set*,insert*,add*,imp* transactional.method.readOnly=get*,query*,find*,select*,list*,is*,count* |
二.配置类 OssTransactionAdviceConfiguration
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | /** * @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()); } } |
三.测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @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 ; } } |
测试结果:
数据库并没有插入对应数据,事务回滚了。
标签:
Spring Boot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix