Spring事务实践:事务的传播机制

事务传播机制

在这里插入图片描述

示例:
在这里插入图片描述

传播机制测试

@Override
public User testTransactional02() {
	User user = new User();
	user.setUsername("田所浩二");
	user.setEmail("191919191919@.qq.com");
	user.setPassword("78945613213");
	user.setAdmin(false);
	User insert = jpaServiceImpl.doSave(user);
	insert.setTelephone("1919810124124");
	User update = jpaServiceImpl.doUpdate(insert);
	System.out.println("update: " + update.getId());
	return update;
}

@Transactional(rollbackFor = RuntimeException.class, transactionManager = "transactionManager")
public User doSave(User user) {
	return userRepository.save(user);
}

@Transactional(rollbackFor = RuntimeException.class, transactionManager = "transactionManager")
public User doUpdate(User user) {
	userRepository.save(user);
	throw new RuntimeException("抛个异常");
}

NESTED测试

JPA不支持NESTED传播机制
在这里插入图片描述

REQUIRES_NEW

@Override
@Transactional
public User testTransactional02() {
	User user = new User();
	user.setUsername("田所浩二");
	user.setEmail("191919191919@.qq.com");
	user.setPassword("78945613213");
	user.setAdmin(false);
	User insert = jpaServiceImpl.doSave(user);
	insert.setTelephone("1919810124124");
	User update = jpaServiceImpl.doUpdate(insert);
	System.out.println("update: " + update.getId());
	throw new RuntimeException("抛个异常");
}

@Transactional(rollbackFor = RuntimeException.class, propagation = Propagation.REQUIRES_NEW, transactionManager = "transactionManager")
public User doSave(User user) {
	return userRepository.save(user);
}

@Transactional(rollbackFor = RuntimeException.class, transactionManager = "transactionManager")
public User doUpdate(User user) {
	return userRepository.save(user);
}

结果:doSave()成功 + doUpdate()回滚。
由于doSave()的传播机制是REQUIRES_NEW,即在testTransactional02()的事务中doSave()也会分别新建一个事务,相当于不受testTransactional02()事务的控制。而doUpdate()是默认的传播机制REQUIRE,因为testTransactional02()的异常而连带回滚。

NOT_SUPPORTED

@Override
@Transactional
public User testTransactional02() {
	User user = new User();
	user.setUsername("田所浩二");
	user.setEmail("191919191919@.qq.com");
	user.setPassword("78945613213");
	user.setAdmin(false);
	User insert = jpaServiceImpl.doSave(user);
	insert.setTelephone("1919810124124");
	User update = jpaServiceImpl.doUpdate(insert);
	System.out.println("update: " + update.getId());
	throw new RuntimeException("抛个异常");
}

@Transactional(rollbackFor = RuntimeException.class, propagation = Propagation.NOT_SUPPORTED, transactionManager = "transactionManager")
public User doSave(User user) {
	return userRepository.save(user);
}

@Transactional(rollbackFor = RuntimeException.class, propagation = Propagation.REQUIRES_NEW, transactionManager = "transactionManager")
public User doUpdate(User user) {
	return userRepository.save(user);
}

结果:doSave()、doUpdate()成功执行、testTransactional02()抛异常。
因为doSave()不参与testTransactional02()的事务,doUpdate()也是新创建了一个事务,所以testTransactional02()抛异常不会影响这两个方法。

MANDATORY

@Override
public User testTransactional02() {
	User user = new User();
	user.setUsername("田所浩二");
	user.setEmail("191919191919@.qq.com");
	user.setPassword("78945613213");
	user.setAdmin(false);
	User insert = jpaServiceImpl.doSave(user);
	insert.setTelephone("1919810124124");
	User update = jpaServiceImpl.doUpdate(insert);
	System.out.println("update: " + update.getId());
	throw new RuntimeException("抛个异常");
}

@Transactional(rollbackFor = RuntimeException.class, propagation = Propagation.MANDATORY, transactionManager = "transactionManager")
public User doSave(User user) {
	return userRepository.save(user);
}

@Transactional(rollbackFor = RuntimeException.class, transactionManager = "transactionManager")
public User doUpdate(User user) {
	return userRepository.save(user);
}

结果:doSave()方法直接报错,MANDATORY作为被调用方法时,调用方法必须存在事务。
在这里插入图片描述

参考网址

Spring事务的传播机制_光依旧的博客-CSDN博客_spring事务的传播机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加把劲骑士RideOn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值