【Spring事务传播机制】

多个事务的⽅法相互调⽤时,事务如何在这些⽅法间传播,⽅法A是⼀个事务的⽅法,⽅法A执⾏过程中调⽤了⽅法B,那么⽅法B有没有事务以及⽅法B对事务的要求不同都会对⽅法A的事务具体执⾏造成影响,同时⽅法A的事务对⽅法B的事务执⾏也有影响,这种影响具体是什么就由两个⽅法所定义的事务传播类型所决定

事务传播类型当前存在事务当前没有事务
REQUIRED(Spring默认的事务传播类型)加⼊当前事务新建⼀个事务
SUPPORTS加⼊当前事务以⾮事务⽅法执⾏
MANDATORY加⼊当前事务抛出异常
REQUIRES_NEW挂起该事务新建⼀个事务
NOT_SUPPORTED挂起该事务以⾮事务⽅法执⾏
NEVER抛出异常(不使⽤事务)
NESTED(嵌套的)在嵌套事务中执⾏(创建当前事务的子事务(嵌套事务),子事务不能单独提交,只能和父事务一起提交)和REQUIRED的操作⼀样(新建⼀个事务)
//区别对比:
//1、REQUIRED(默认的传播机制):
method a(){
	b();
	c();  }

@Transactional(propagation = Propagation.REQUIRED)
method b(){
	insert(B); //插入一条数据B
}
@Transactional(propagation = Propagation.REQUIRED)
method c(){
	insert(C);  //插入一条数据C
	throw new Exception("抛一个异常");
}
/*说明:
执行方法a()时,由于当前没有事务,则新建了一个事务A。
执行方法b()时,由于当前存在事务A,则加入事务A,数据B插入成功,但插入数据B的事务A还未提交。
执行方法c()时,由于当前存在事务A,则加入事务A,数据C插入后抛异常,回滚事务A。
结果:数据B插入失败,数据C插入失败。*/

//2、REQUIRES_NEW:
method a(){
	b();
	c();  }

@Transactional(propagation = Propagation.REQUIRES_NEW)
method b(){
	insert(B); //插入一条数据B
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
method c(){
	insert(C); //插入一条数据C
	throw new Exception("抛一个异常");
}
/*说明:
执行方法a()时,由于当前没有事务,则新建了一个事务A。
执行方法b()时,由于当前存在事务A,则把事务A挂起,新建一个事务B,数据B插入成功,事务B提交。
执行方法c()时,由于当前存在事务A,则把事务A挂起,新建一个事务C,数据C插入成功后抛异常,事务C回滚,数据C插入失败后不会影响数据B。
结果:数据B插入成功,数据C插入失败。*/

//3、NESTED:
method a(){
	b();
	c();  }

@Transactional(propagation = Propagation.NESTED)
method b(){
	insert(B); //插入一条数据B
}
@Transactional(propagation = Propagation.NESTED)
method c(){
	insert(C); //插入一条数据C
	throw new Exception("抛一个异常");
}
/*说明:
执行方法a()时,由于当前没有事务,则新建了一个事务A。
执行方法b()时,由于当前存在事务A,则创建一个当前事务的子事务AB,数据B插入成功,此时子事务还未提交,待父事务A提交时才会提交子事务AB。
执行方法c()时,由于当前存在事务A,则创建一个当前事务的子事务AC,数据C插入后抛异常,子事务AC抛异常,待父事务A提交时才回滚。
提交父事务A,提交子事务AB,回滚子事务AC。
结果:数据B插入成功,数据C插入失败。*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值