什么是事务?

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

spring默认默认事务传播级别是 spring的默认事务传播方式_记录日志

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

spring默认默认事务传播级别是 spring的默认事务传播方式_回滚_02


1、Propagation.REQUIRED (默认事务):

如果当前存在了事务,那就融入这个事务中,没有则重新创建

spring默认默认事务传播级别是 spring的默认事务传播方式_spring默认默认事务传播级别是_03

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

2、Propagation.REQUIRES_NEW

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

spring默认默认事务传播级别是 spring的默认事务传播方式_回滚_04

可以用在记录日志, 银行取钱,中间调用一个 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("反正我不创建事务,但是没有我就报错");
		}
	}