Spring事务的传播级别
required: 如果当前有事务就使⽤当前事务,如果没有就新建⼀个事务(default)
requires_new: ⽆论有没有事务,总是新建⼀个事务
nested: 和required类似,不同点在于会设置⼀个还原点,如果出问题只会还原本⽅法,并不会还原外部⽅法。
supports: ⽀持当前事务,如果当前没有事务,就以⾮事务的⽅式执⾏
not_supported: 以⾮事务的⽅式执⾏,如果当前存在事务就挂起
never: 总是在⾮事务下执⾏,如果有事务就报错
mandatory: 总是在事务下执⾏,如果没有事务就报错
------------------------------------------------------------------------------具体实例---------------------------------------------------------------------------------------------REQUIRED
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
void a(){
before();
b();
after();
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
void b(){
//
}
a()调⽤b()的情况下:a()会开启⼀个事务,然后b()会继续使⽤a()的事务。
单独调⽤b():b()就会新开启⼀个事务。⽆论是哪个⼀个报错(抛异常), before() b() after()这三个都会回滚。
如果嵌套执⾏的⽅法要求⼀起执⾏成功或者⼀起回滚,则选择该事物传播级别。
REQUIRES_NEW
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
void a(){
before();
b();
after();
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
void b(){
//
}
a()调⽤b()的情况下:a()会开启⼀个事务,然后b()不会继续使⽤a()的事务,会单独开启⼀个事务。如果b()报错了,只会回滚b(),不会影响before()。after()报错了也不会影响b()。
如果嵌套执⾏的⽅法要求各⾃事务独⽴,不能进⾏相互影响,则选择本事务传播级别。
NESTED
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
void a(){
before();
b();
after();
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.NESTED)
void b(){
//
}
a()调⽤b()的情况下:a()会开启⼀个事务,然后b()会继续使⽤a()的事务。但是b()会设置⼀个还原点,当b()报错了,只会回滚b()⾃已,不会回滚before()。如果after()报错了这三个都会回滚。
可以使⽤以下代码设置保存点和回滚到时指定的保存点
//设置保存点
Object savepoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
//回滚到指定的保存点
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savepoint);
//如果需要在catch块中做⼀些其他操作,这时⽅法不可以抛出异常,则可以在catch块中加⼊这⾏代码⽤来替代throws Exception TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
如果嵌套执⾏的⽅法要求内部⽅法出错只回滚⾃⼰,外部⽅法执⾏失败回滚所有,单独执⾏时候⾃动开启⼀个执⾏,则选择该事物传播级别。
MANDATORY
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
void a(){
before();
b();
after();
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.MANDATORY)
void b(){
//
}
a()调⽤b()的情况下:和REQUIRED⼀样。
单独调⽤b():报错。
如果嵌套执⾏的⽅法要求⼀起执⾏成功或者⼀起回滚,单独执⾏时候不允许以⾮事务⽅式执⾏,则选择该事物传播级别。
NEVER
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
void a(){
before();
b();
after();
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.NEVER)
void b(){
//
}
a()调⽤b()的情况下:报错。
单独调⽤b():不开启事务。
如果嵌套执⾏的⽅法要求内部⽅法不允许在事务中执⾏,单独执⾏时候必须以⾮事务⽅式执⾏,则选择该事物传播级别。
SUPPORTS
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
void a(){
before();
b();
spring roll怎么读after();
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.SUPPORTS)
void b(){
//
}
a()调⽤b()的情况下:和REQUIRED⼀样。
单独调⽤b():不开启事务。
如果嵌套执⾏的⽅法要求⼀起执⾏成功或者⼀起回滚,单独执⾏时候以⾮事务⽅式执⾏,则选择该事物传播级别。
NOT_SUPPORTED
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
void a(){
before();
b();
after();
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.NOT_SUPPORTED)
void b(){
//
}
a()调⽤b()的情况下:挂起a()的事务,不在事务的情况下b(),after()也⽆法影响b()。
单独调⽤b():不开启事务。
如果嵌套执⾏的⽅法要求内部嵌套⽅法不会对外部⽅法事务造成影响并且内部⽅法不需要事务,单独执⾏时候以⾮事务⽅式执⾏,则选择该事物传播级别。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论