spring的事务传播机制简单易懂

什么是事务?

就是怎么处理两个事务之间的关系

什么是事务的传播行为

假设A方法出现了异常那么 B方法要不要回滚呢?
又或者B方法出现异常,A方法要不要回滚?
需要该怎么做不需要又该怎么做?
这类问题就可以用到spring给出的7种事务传播特性解决 

事务的7种传播行为
1、Propagation.REQUIRED (默认事务):
如果当前存在了事务,那就融入这个事务中,没有则重新创建
REQUIRED

	假设出现异常那么update() 和 delete() 方法都会执行失败,因为在同一个事务中。

2、Propagation.REQUIRES_NEW
需要一个新事物,不管外部有没有,如果原来有,就挂起原事务REQUIRES_NEW

	可以用在记录日志, 银行取钱,中间调用一个 log(); 记录日志方法,
	不管取钱是失败还是成功都记录一次

3、Propagation.NESTED:
如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务
(嵌套事务,子事务回滚不影响外层事务,但是外层事务回滚子事务会一起回滚)

	@Service
	class Service{
	    @Transactional
		public void Parents(){
		Sysout.out.println(" 我出错了,son一起回滚");
		son();
		}
	
		@Transactional(propagation = Propagation.NESTED)
		public void son(){
		Sysout.out.println(" 我出错了,我自己回滚");
		}
	}
PROPAGATION_REQUEIRES_NEW:肯定会创建子事务,父子互不影响;
PROPAGATION_NESTED:肯定会创建子事务,父影响子,子不影响父;
PROPAGATION_REQUEIRED:子事务和父事务合并成一个事务,父子互相影响;

4、Propagation.SUPPORTS:
如果没有就以非事务的方式执行,如果有则融入该事务

	@Service
	class Service{
		@TransacTional
		public void updateUser(){
			findAll();
		}
		// 这类 事务建议放在查询语句中 
		@Transactional(propagation = Propagation.SUPPORTS)
		public List<User> findAll(){
			deleteUser();
		}
		@TransacTional
		public void updateUser(){
			Sysout.out.println(" delete,如果findAll方法没有@Transactional(propagation = Propagation.SUPPORTS");
			Sysout.out.println(" 那updateUser的事务就没办法延续到这里");
		}
	}

死活都不要事务的
5、Propagation.NEVER: 只要有事务我就报错
6、Propagation.NOT_SUPPORTED: 没有就非事务执行,有就直接挂起,然后非事务执行

	@Service
	class Service{
	    @Transactional
		public void Boss(){
		Sysout.out.println(" 我是老板");
		worker2();
		worker1();
		}
		
		@Transactional(propagation = Propagation.NEVER)
		public void worker1(){
		Sysout.out.println(" 我是工人1,我不要事务,给我就报错");
		}
		
		@Transactional(propagation = Propagation.NOT_SUPPORTED)
		public void worker1(){
		Sysout.out.println(" 我是工人2,没有事务最好,你的事务管不着我,你先等我执行完你的事务才能走");
		}
	}

7、Propagation.MANDATORY:
如果没有,就抛出异常,如果有,就是用当前的

	@Service
	class Service{
		@Transactional
		public void A(){
			B(); 
		}
		@Transactional(propagation = Propagation.MANDATORY)
		public void B(){
			System.out.println("反正我不创建事务,但是没有我就报错");
		}
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值