欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring事务的传播行为

程序员文章站 2022-05-06 21:37:23
...

Spring事务的传播行为

简介
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。
事务的传播行为可以由传播属性指定。Spring定义了7种类传播行为。
Spring事务的传播行为
①事务传播属性可以在@Transactional注解的propagation属性中定义。
②有事务的业务逻辑,容器中保存的是这个业务逻辑的代理对象

@Service
public class BookService {
    @Autowired
    BookDao bookDao;

	//结账事务
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void checkup(String username,String isbn ){
            
        //减少书本的库存
        bookDao.updateStock(isbn);
        int price = bookDao.getPrice(isbn);
        
        //减少用户账户余额
        bookDao.updateAccount(username, price);

    }

    
    //修改书籍的价格事务
    @Transactional(propagation = Propagation.REQUIRED)
    public void updatePrice(String isbn,int price ){
    	//修改书籍价格
        bookDao.updatePrice(isbn,price);
    }
}

@Service
public class MulService {
    @Autowired
    BookService bookService;

    @Transactional
    public void mulTx(){
        //传播行为来设置这个事务方法是不是和之前的大事务共享一个事务(使用同一条连接);
        //REQUIRES_NEW
        bookService.checkup("Tom", "ISBN-001");//结账事务

        //REQUIRED
        bookService.updatePrice("ISBN-002", 998);//修改书籍的价格事务

        int a = 10/0;
    }
}

public class BookTest {
    @Test
    public void testIDE(){
        ApplicationContext ioc = new ClassPathXmlApplicationContext("tx.xml");
        MulService bean = ioc.getBean(MulService.class);
        bean.mulTx();
    }
}

REQUIRED:将之前事务用的connection传递给这个方法使用;
REQUIRES_NEW:这个方法直接使用新的connection;

在该测试中出现数学异常,和大事务同一个Connection连接的小事务(修改书籍的价格事务)不提交,而使用新Connection连接的小事务(结账事务)成功提交。

Spring事务的传播行为

对于复杂嵌套的事务

  multx(){
  		//REQUIRED
  		A(){
  			//REQUIRES_NEW
  			B(){}
  			//REQUIRED
  			c(){}
  		}
  		
  		//REQUIRES_NEW
  		D(){
  			DDDD()//  REQUIRES_NEW不崩,REQUIRED崩
  			//REQUIRED
  			E(){
  				//REQUIRES_NEW
  				F(){
  					//10/0,并且异常向外抛(E崩,G崩,D崩,A,C崩)
  				}
  			}
  			//REQUIRES_NEW
  			G(){}
  		}
  
  
  		
  		任何处崩,已经执行的REQUIRES_NEW都会成功;
  
  		如果是REQUIRED;事务的属性都是继承于大事务的;
  		而propagation=Propagation.REQUIRES_NEW可以调整
  		

  }
相关标签: Spring