分享

springboot加了事务处理不生效原因以及解决方法

 新用户57365882 2023-11-01 发布于浙江

引言

在springboot项目开发中,在与mysql数据库打交道时,常常会用到事务处理,但是有时候用了事务,往往不起作用,那是什么原因呢,又该从何着手解决呢?


事务失效常见场景

  • mysql数据库引擎为MyISAM引擎,事务失效

  • 事务注解放到了controller层,事务失效

  • 事务注解的方法里捕获了异常,事务失效

  • 非直接调用,事务失效

  • 事务注解在私有方法、保护方法上,事务失效

  • 事务注解值的异常抛出不对,事务失效

  • 事务注解的方法里运行多线程,事务失效


解决方案

mysql数据库引擎为MyISAM引擎,事务失效,解决方法为将MyISAM引擎修改为Innodb引擎即可。

原因:MyISAM不支持事务处理。Innodb支持事务回滚。

事务注解放到了controller层,事务失效,解决方法为将事务注解放置在实现类的方法里面。

原因:在java中,controller主要用来为视图和业务搭建桥梁,因此在spring的家族中,是不允许controller设置事务的。

事务注解的方法里捕获了异常,事务失效,解决方法为在捕获异常的块里添加如下代码即可生效

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

原因:不清楚。

非直接调用,事务失效,解决方法为事务对应的方法应直接在controller层直接调用,不允许在事务注解的方法对应的类上面继续调用该方法。

原因:不明确

事务注解在私有方法、保护方法上,事务失效,解决方法为将私有方法,保护方法统一设置为公共方法。

原因:在java中,私有变量、私有方法只允许自己类使用,不允许外用;保护变量,保护方法只允许自己和子类使用,不允许外用。

事务注解值的异常抛出不对,事务失效,解决方法,如不能明确异常,则在事务注解中添加Exception异常,如已明确对应异常,则在事务注解中添加对应异常即可。

原因:事务注解只能捕获对应的异常处理,如不指定,则默认捕获RunTimeException(运行时异常),比如常见的空指针。其他异常将无法捕获。

事务注解的方法里运行多线程,事务失效,解决方法为将多线程剔除,事务必须放在单个线程才能生效。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多