zoukankan      html  css  js  c++  java
  • Spring事务嵌套引发的异常: Transaction rolled back because it has been marked as rollback-only

    spring的@Transactional 可以注解到方法上或者类上,并且只有在 该类被作为spring容器托管的bean的时候,也就是使用@autowird 被注入到其他类中使用,调用该类的方法的时候才生效

    因为此时调用方法会被spring容器的 TransactionInterceptor 拦截器拦截,并开启事务

    如果是同一个类中的方法 调用 第二个方法 即this.方法 ,第二个方法的事务 是不起作用的,这种情况没有 mark-as roll异常

    出现marked as rollback-only异常,是因为使用默认的@Transactional 注解,事务的传播性默认为Propagation.REQUIRED,调用其他类的 事务方法addPerson(user);

    这个方法开启的事务是默认Propagation.REQUIRED,也就是沿用外层调用方法的事务 (如果有事务存在 则使用原事务 如果不存在则开启新事务)

    外层方法开启了一个事务,内层方法调用的是其他类的事务方法,内层方法发现异常了,会标记整个事务为roll-back,但是外层方法捕获异常 return的时候 会执行commit事务 但是此时发现已经标记异常,所以才会抛出异常

  • 相关阅读:
    testng遇到的一些问题
    Redis-常用命令总结
    Spring AOP
    Spring IOC
    Java-J.U.C总结
    Java-将map拼接成“参数=值&参数=值”
    java多线程-线程池
    mysql 二进制文件增量备份
    Centos下mysql数据库备份与恢复的方法
    CentOS下mysql默认安装位置
  • 原文地址:https://www.cnblogs.com/internHe/p/14859917.html
Copyright © 2011-2022 走看看