@Transactional注解中事务的传播行为总结

@Transactional注解中事务的传播行为总结


在事务的注解@Transactional中的propagation字段定义了事务的传播行为
@Transactional注解中事务的传播行为总结_第1张图片


当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。
事务的传播行为可以由传播属性指定。Spring定义了7种类传播行为。



@Transactional注解中事务的传播行为总结_第2张图片



@Transactional
	public void mulTx() {//这个事务嵌套了两个小事务
		
		bookService.check("Tom", "ISBN-001");
		
		bookService.updatePrice("ISBN-002", 998);
		
		
	}

对于上图,这三个方法都是通过注解的声明式事务。如果把内部两个事务的propagation字段的值设置为REQUIRED,那么他们会在mulTx的内部运行,当某一个事务异常,则整体回滚

此时,如果将updatePrice的propagation字段设置为REQUIRES_NEW,那么updatePrice会自己创建新的事务,check和mulTx则是绑定在一起的,如果updatePrice出错回滚,虽然他创建了新的事务,但是他将异常抛出,mulTx接收到这个异常,依旧会回滚。

如果将上面的方法的propagation字段设置为REQUIRES_NEW,当下面的方法出现异常,会回滚,但是上面的方法创建了自己的事务,在开启自己的事务之前将mulTx事务挂起,并且在下面的事务开启之前已经提交,数据库内容已经被修改,故不会受到影响

@Transactional注解中事务的传播行为总结_第3张图片

你可能感兴趣的:(Spring)