注意:仅用于个人理解手记,不具备权威准确性
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不可以操作同一条记录,因为处于不同事务,会产生死锁