Spring事务传播方式

1.PROPAGETION_REQUIRED(默认事务传播方式)

如果当前没有事务则创建一个新事物,如果有则直接加入

    //progation_required 默认事务传播方式
    @Transactional(propagation = Propagation.REQUIRED)
    public void main(){
        BookTypes bookTypes = new BookTypes("1","1","1","1");
        bookTypesDao.insert(bookTypes);
        test();
    }
    @Transactional(propagation = Propagation.REQUIRED)
    public  void test(){
        BookTypes bookTypes = new BookTypes("1","2","1","1");
        bookTypesDao.insert(bookTypes);
        int a=1/0;
    }

上述由于test方法加入了main方法里面的事务当test方法发生异常时,所有的插入操作都回滚了。

2.PROPAGETION_REQUIRES_NEW(需要新事务)

当前如果没有事务将创建一个事务,如果当前存在事务,还是会创建一个事务

    @Transactional(propagation = Propagation.REQUIRED)
    public void main(){
        BookTypes bookTypes = new BookTypes("1","1","1","1");
        bookTypesDao.insert(bookTypes);
        test();
        int a=1/0;
    }
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public  void test(){
        BookTypes bookTypes = new BookTypes("1","2","1","1");
        bookTypesDao.insert(bookTypes);
       
    }

main方法和test方法都存在事务,所以当main方法出现异常时,main方法将回滚,但不影响test方法,应该两者时不同的事务互不影响,所以结果只有test方法插入成功。

3.PORAGATION_SUPPORTS(支持事务)

如果当前不存在则不使用事务,存在事务则使用事务

    public void main(){
        BookTypes bookTypes = new BookTypes("1","1","1","1");
        bookTypesDao.insert(bookTypes);
        test();
    }
    @Transactional(propagation = Propagation.SUPPORTS)
    public  void test(){
        BookTypes bookTypes = new BookTypes("1","2","1","1");
        bookTypesDao.insert(bookTypes);
        int a=1/0;
    }

上面main方法没有事务,test也没有有事务,当test发生异常时,两者都不会进行事务操作。所以结果时两个方法都成功执行插人操作

4.PROPAGATION_NOT_SUPPORTS(不支持事务)

如果当前存在事务,则将该事务挂起。

    @Transactional(propagation = Propagation.REQUIRED)
    public void main(){
        BookTypes bookTypes = new BookTypes("1","1","1","1");
        bookTypesDao.insert(bookTypes);
        test();
    }
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public  void test(){
        BookTypes bookTypes = new BookTypes("1","2","1","1");
        bookTypesDao.insert(bookTypes);
        int a=1/0;
    }

上面main存在事务,当执行到test方法时,事务会挂起,所以test出现异常时,test不会回滚,main方法会回滚。结果只有test方法插入了。

5。PROPAGRTION_MANDATORY(强制执行事务)

如果当前没有事务的话,就会直接报异常。

    public void main(){
        BookTypes bookTypes = new BookTypes("1","1","1","1");
        bookTypesDao.insert(bookTypes);
        test();
    }
    @Transactional(propagation = Propagation.MANDATORY)
    public  void test(){
        BookTypes bookTypes = new BookTypes("1","2","1","1");
        bookTypesDao.insert(bookTypes);
        int a=1/0;
    }

mian没有事务,当执行到test方法时,会因为获取不到事务而直接报异常,所以结果是只有main插入成功。

6.PROPAGATION_NEVER(从来不使用事务)

如果当前有事务,就会直接报异常。

    @Transactional(propagation = Propagation.REQUIRED)
    public void main(){
        BookTypes bookTypes = new BookTypes("1","1","1","1");
        bookTypesDao.insert(bookTypes);
        test();
    }
    @Transactional(propagation = Propagation.NEVER)
    public  void test(){
        BookTypes bookTypes = new BookTypes("1","2","1","1");
        bookTypesDao.insert(bookTypes);
        int a=1/0;
    }

main方法存在事务,当执行test方法时,会直接报异常,所以结果只有main方法插入成功。

7.PROPAGATION_NESTED(嵌套事务)

如果当前存在事务,则在嵌套事务(你可以简单理解就是原事务)中执行,但嵌套事务的执行不影响原事务,如果不存在,则创建一个新事务。

    @Transactional(propagation = Propagation.REQUIRED)
    public void main(){
        BookTypes bookTypes = new BookTypes("1","1","1","1");
        bookTypesDao.insert(bookTypes);
        test();
    }
    @Transactional(propagation = Propagation.NESTED)
    public  void test(){
        BookTypes bookTypes = new BookTypes("1","2","1","1");
        bookTypesDao.insert(bookTypes);
        int a=1/0;
    }

mian方法存在事务,当test方法出现异常时,test方法会回滚,但不影响原事务(main方法里面的事务),所以结果只有main插入成功。

这个嵌套事务跟需要事务有什么区别,我在这直接放一段代码,同学们自己思考结果,只要你理解了上面就不难。

    @Transactional(propagation = Propagation.REQUIRED)
    public void main(){
        BookTypes bookTypes = new BookTypes("1","1","1","1");
        bookTypesDao.insert(bookTypes);
        test();
        int a=1/0;
    }
    @Transactional(propagation = Propagation.NESTED)
    public  void test(){
        BookTypes bookTypes = new BookTypes("1","2","1","1");
        bookTypesDao.insert(bookTypes);
    }

这里再说一下事务失效问题:

1.再同一个类中,一个非事务方法条用一个事务方法,此时就会失效。因为事务是根据aop实现的,用容器获取的类其实是ioc创建的代理类,调用该类的test方法实际时调用被代理的类的test方法,而被代理的test方法调用的transAcounts()方法实际隐藏了 this,即调用的时this.transAcounts(),之后调用被代理的类的transAcounts方法,该方法没有被spring事务管理。

2.异常被捕获了

如果异常被捕获了,那么事务就检测不到异常自然不能触发事务管理。

Spring事务传播方式是指在一个service方法调用另一个service方法时,事务如何进行传播。Spring的默认事务传播方式是PROPAGATION_REQUIRED。这意味着如果当前存在一个事务(比如其他有事务的service方法调用此方法),则该方法将运行在当前事务中,否则将开启一个新的事务。 需要注意的是,调用methodB的方法必须使用Spring的代理方式,即用testService.methodB()方式调用,如果只是普通方法调用(比如this.methodB()),事务将不会起作用。同时,可以使用@Transactional注解来标注需要进行事务管理的方法。 在一些特殊情况下,可以使用其他的事务传播方式。例如,当methodA调用methodB时,当前事务会被挂起,然后在methodB中会开启一个新的事务。methodB执行完并且事务提交后,methodA的事务继续执行。这种情况下,可以在methodB上使用@Transactional(propagation = Propagation.REQUIRES_NEW)来设置事务传播方式。 总结起来,Spring提供了多种事务传播方式,根据具体需求可以选择合适的方式来管理事务。默认的传播方式是PROPAGATION_REQUIRED,即如果当前存在一个事务,则在该事务中运行,否则开启一个新的事务。同时,需要使用Spring的代理方式调用有事务管理的方法才能确保事务的正确运行。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值