概述
如需转载,请联系作者授权,否则禁止转载
引言
在springboot项目开发中,在与mysql数据库打交道时,常常会用到事务处理,但是有时候用了事务,往往不起作用,那是什么原因呢,又该从何着手解决呢?
事务失效常见场景
-
mysql数据库引擎为MyISAM引擎,事务失效
-
事务注解放到了controller层,事务失效
-
事务注解的方法里捕获了异常,事务失效
-
非直接调用,事务失效
-
事务注解在私有方法、保护方法上,事务失效
-
事务注解值的异常抛出不对,事务失效
-
事务注解的方法里运行多线程,事务失效
解决方案
**mysql数据库引擎为MyISAM引擎,事务失效,**解决方法为将MyISAM引擎修改为Innodb引擎即可。
原因:MyISAM不支持事务处理。Innodb支持事务回滚。
事务注解放到了controller层,事务失效,解决方法为将事务注解放置在实现类的方法里面。
原因:在java中,controller主要用来为视图和业务搭建桥梁,因此在spring的家族中,是不允许controller设置事务的。
事务注解的方法里捕获了异常,事务失效,解决方法为在捕获异常的块里添加如下代码即可生效
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
原因:不清楚。
非直接调用,事务失效,解决方法为事务对应的方法应直接在controller层直接调用,不允许在事务注解的方法对应的类上面继续调用该方法。
原因:不明确
事务注解在私有方法、保护方法上,事务失效,解决方法为将私有方法,保护方法统一设置为公共方法。
原因:在java中,私有变量、私有方法只允许自己类使用,不允许外用;保护变量,保护方法只允许自己和子类使用,不允许外用。
事务注解值的异常抛出不对,事务失效,解决方法,如不能明确异常,则在事务注解中添加Exception异常,如已明确对应异常,则在事务注解中添加对应异常即可。
原因:事务注解只能捕获对应的异常处理,如不指定,则默认捕获RunTimeException(运行时异常),比如常见的空指针。其他异常将无法捕获。
事务注解的方法里运行多线程,事务失效,解决方法为将多线程剔除,事务必须放在单个线程才能生效。
最后
以上就是微笑马里奥为你收集整理的springboot加了事务处理不生效原因以及解决方法的全部内容,希望文章能够帮你解决springboot加了事务处理不生效原因以及解决方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复