spring事务的传播机制

注意:仅用于个人理解手记,不具备权威准确性

spring事务的传播机制

一.场景

A类方法调用B类方法有效,同类多个方法调用无效,一般是加载service层的调用者和被调用者方法上

二.默认属性

@Transactional(propagation=Propagation.REQUIRES, isolation=Isolation.READ_COMMITTED, noRollbackFor={UserAccountException.class}, readOnly=true, timeout=3)

propagation,指定传播机制类型,默认REQUIRED

isolation,事务隔离级别,默认使用数据库设置的隔离级别

noRollbackFor,指定异常回滚类型,默认RuntimeException

readOnly,指定事务是否为只读,表示这个事务只读取数据不更新数据,可以帮助数据库引擎优化事务

timeout,指定强制回滚之前事务可以占用的时间

三.传播机制类型说明

Demo:A中方法调用B中方法

PROPAGATION_REQUIRED:如果B没有事务,就新建事务,如果A有事务,则B加入到A的事务中

PROPAGATION_REQUIRES_NEW:开启新事务,如果A有事务,则将A挂起,B开启新事务,B可独立提交和回滚,B执行完,外层A恢复执行,A异常不会影响B提交

PROPAGATION_NESTED:嵌套事务,A回滚则B回滚,A提交B才提交;B回滚不会影响A回滚,因为A进入B时会建立savepoint回滚点,如果B回滚则会回滚到savepoint回滚点,A继续执行;因为B的提交依赖于A的提交,所以A回滚,B也会回滚.

PROPAGATION_SUPPORTS:如果A有事务,则B加入事务;如果A没有事务,则B也没有事务

PROPAGATION_NOT_SUPPORTED:如果A有事务,B不加入事务,A运行单独的事务

PROPAGATION_MANDATORY:加入A事务,如果A没事务则抛异常,强制A有事务

PROPAGATION_NEVER:强制A不能有事务,如果在A上则A无事务

四.回滚说明

1.A和B都是REQUIRED:

B异常,A捕获B的异常:则全部回滚,且A抛出异常 Transaction rolled back because it has been marked as rollback-only

B异常,B捕获,都不回滚

A异常,A捕获,都不回滚

A异常,都回滚

B异常,都回滚

2.A是REQUIRED,B是REQUIRES_NESTED 嵌套事务

B异常,A捕获,则B回滚,A不回滚

A异常,则都回滚

B异常,则都回滚

主要是:A异常可以回滚B

3.A是REQUIRED,B是REQUIRES_NEW 新事务

B异常,A捕获,则B回滚,A不回滚

A异常,不影响B提交

B异常,都回滚

主要是:A异常,不影响B提交

A和B不可以操作同一条记录,因为处于不同事务,会产生死锁

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值