事务失效场景

一、 访问符非public

  1. 改为public

  2. 开启AspectJ代理

  注: static和final会导致动态无法代理,导致事务不生效;动态代理的方式有两种:JDK动态代理,cglib代理,static使method属于类而不属于任何对象,即使写法上是重写,也没有重写的含义,即重写static方法是没有意义的

 

二、 @Transactional抛出的异常并非是spring事务支持的异常。如:Exception

  1. rollback=Exception.class

  2. throw new RuntimeException

  注:只支持uncheck的Exception

 

三、 数据库不支持的事务

  mysql中的MyISAM是不支持事务的,InnoDB是支持事务的

 

四、@Service被注释

  不被spring管理的是不支持事务的

 

五、 异常被捕获

  1. 捕获的异常再抛出

 

六、 方法自身调用问题(非事务方法调用事务;自己调用自己)

  1. 拆分

  2. 自己注入自己,调用实例

  3. 获取代理类(AopContext.currentProxy().method)

 

七、 数据源没有配置事务管理器

 

八、传播类型不支持事务

 

九、 多线程调用

  多线程分为(1、继承Thread;2、实现Runable;3、实现Callable和Future(实现Callable接口后,用FutureTask包装Callable类,然后用Thread封装Future,最后使用start启动))

  在方法上使用REQUIRES_NEW作为隔离等级,在调用方法上使用@Transactional开启事务

  隔离类型

  1. required  没有事务就新建,有就加入

  2. support  有加入,没有就无事务执行

  3. mandatory  没有事务就抛出异常

  4. required_new  有事务就建一个新的事务

  5. not_support  有事务就挂起,以非事务执行

  6. never  以非事务执行,有就抛出异常

  7. nested  有事务就嵌套执行,没有就建一个新的事务

  required_new新事物执行完就会提交,但是nested会等待最外层的事务执行完再提交

  嵌套事务分为父子事务:

    父事务提交的时候,子事务也提交

    父事务回退的时候,子事务也回退

    但是子事务的回退不会影响到父事务

posted @   cambra  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示