spring事务失效的场景

spring事务的七种传播机制

事务方法发生了相互调用,事务如何传播:a调用b

  • REQUIRED(spring默认的事务传播级别):如果当前(a)没有事务,则(b)新建一个事务,如果当前存在事务,则加入这个事务。
  • REQUIRES_NEW:新建一个事务,如果当前存在事务,则挂起这个事务。各自有各自的事务
  • SUPPORTS:如果当前存在事务,则加入这个事务。如果当前不存在事务,则以非事务方式运行
  • NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则挂起事务,(a有事务就以事务方式运行,b以非事务方式运行)
  • MANDATORY:当前存在事务,则加入这个事务,当前没有事务,则抛出异常
  • NESTED:嵌套创建事务。如果当前存在事务,开启一个子事务。没有事务,就新建一个事务。(和required类似)
  • NEVER:非事务方式运行,当前存在事务,抛出异常
    ps:
    REQUIRES_NEW:新建的事务和原来事务无关,互不影响
    Nested:父事务回滚时,子事物也会回滚

spring事务失效的场景

1.数据库不支持事务(MyIsam):spring事务是基于数据库的,数据库引擎不支持事务。

2.没有被spring管理:比如业务层没有@Service注解,不由spring管理,自然事务不会生效。

3.spring没有开启事务:spring没有配置事务管理器DataSourceTransactionManager

4.spring不支持事务:事务传播机制的never或者not_supported这类,不支持事务。

5.方法不是public的:@Transation注解只能用于public方法的注解上。除非开启Aspectj代理模式

6.自身调用问题:spring事务通过aop来实现事务操作,如果只是类中使用this.或者直接调用方法,那就是相当于在代理类中调用了类中一个方法,事务自然失效。可以将自身注入,通过bean调用。

7.事务不会回滚:spring默认只会回滚非检查异常,RuntimeException,如果你想触发其他异常的回滚,需要在注解上使用rollbackfor配置一下

8.自己吞了异常:使用try cache将异常处理了,不抛异常,事务失效。

posted @ 2023-03-11 17:52  一个苦逼的23届毕业生  阅读(24)  评论(0编辑  收藏  举报