搞懂spring事务
最近一个官网的项目,我在service层有两个添加数据的操作,很意外报错了,然后就研究到了事务
之前只是知道声明式事务和编程式事务,编程式的事务显得比较麻烦,一般都是使用声明式事务..
spring提供了很多种配置方式:
1 编程式事务:
开启事务;
try{
更新或添加操作;
提交;
}catch(..){
回滚;
}
2 声明式事务:
提交,回滚的操作写在了一个代理类里头,在执行事务方法之前开启事务,在执行完方法之前提交或者回滚事务
1 给每个bean(service类)配置一个代理类
2 所有service类公用一个代理类
3 拦截器(aop的方式)
4 全注解(在service类加上Transaction)
注 : spring只对runtiomException才会回滚(经测试的) 提供了对应的属性设置异常类型
下面是我项目里头事务的配置 (config配置呢) :
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 | /** * 注解声明式事务配置(相当于上述的aop方式的配置) * @author liyong * */ @Configuration public class TxAdviceTransactionConfig { private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.mike.mihome.*.service..*.*(..))" ; @Autowired private PlatformTransactionManager transactionManager; @Bean public TransactionInterceptor txAdvice(){ NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource(); //只读事务,不做更新操作 RuleBasedTransactionAttribute readOnlyTx = new RuleBasedTransactionAttribute(); readOnlyTx.setReadOnly( true ); readOnlyTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED); //当前存在事务就使用当前事务,当前不存在事务就创建一个新的事务 RuleBasedTransactionAttribute requiredTx = new RuleBasedTransactionAttribute(); // requiredTx.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class))); //设置异常类型 requiredTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); requiredTx.setTimeout( 10000 ); Map<String, TransactionAttribute> txMap = new HashMap<String, TransactionAttribute>(); txMap.put( "query*" , readOnlyTx); txMap.put( "get*" , readOnlyTx); txMap.put( "*" , requiredTx); source.setNameMap(txMap); TransactionInterceptor txAdvice = new TransactionInterceptor(transactionManager, source); return txAdvice; } @Bean public Advisor txAdviceAdvisor() { AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); pointcut.setExpression(AOP_POINTCUT_EXPRESSION); return new DefaultPointcutAdvisor(pointcut, txAdvice()); } } |
注 : 我这个项目有点坑,最后才知道是我这数据库不支持事务的缘故,底层引擎是 MyISAM 的...
MyISAM引擎不支持事务
如果要支持事务的话,则考虑InnoDB或BDB存储引擎(日常中一般都是选InnoDB较多)。所以,并不是我的问题,但是了解到了很多问题.
1 spring 事务默认只对运行时异常回滚,非运行时异常是不会滚的哦,所以我的方法里头设置了Exception
2 aop配置方式也有两种: 一种是xml配置和注解的配置
关于http协议
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!