spring基础知识 (25):事务的传播行为

  • 当事务方法被另一个事务方法调用时, 必须指定事务应该如何传播. 例如: 方法可能继续在现有事务中运行, 也可能开启一个新事务, 并在自己的事务中运行.
  • 事务的传播行为可以由传播属性指定. Spring 定义了 7 种类传播行为.
    spring基础知识 (25):事务的传播行为_第1张图片

还是小花给小明转账的问题:
本节只提供部分代码,其余的代码请去上一节查看:
认识事务并配置一个JDBC事务管理

这次转账两次,第一次转账100元,第二次50元。定义一个batchTransfer方法,将两次转账放在一起进行批量转账.
初始数据:
这里写图片描述

默认传播属性

默认传播属性@Transactional相当于@Transactional(propagation=Propagation.REQUIRED)

  • TransferDao中的转账方法transfer
//转账
@Transactional
public void transfer(int money){
    //为了测试需要,先入账
    this.income("小明", money);
    //再出账
    this.outcome("小花", money);
    System.out.println("转账成功...");
}
  • 在TransferService中定义batchTransfer批量转账:
@Autowired
private TransferDao transferDao;

@Transactional
public void batchTransfer(){
    //第一次转账
    transferDao.transfer(100);
    //第二次转账
    transferDao.transfer(50);
}
  • 测试:
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-account.xml");
TransferService transferService = (TransferService) ctx.getBean("transferService");
//执行转账
transferService.batchTransfer();

spring基础知识 (25):事务的传播行为_第2张图片

spring基础知识 (25):事务的传播行为_第3张图片

从截图看很容易发现,确实转账了两次,第一次转账成功,第二次发生了余额不足的异常,但是查看数据库,发现账户余额不变,这就是事务的默认传播属性:@Transactional(propagation=Propagation.REQUIRED)
事务默认传播属性,两次流程放在了一个事务中管理,当所有流程结束再进行统一提交,出现问题也是一起整体回滚。
spring基础知识 (25):事务的传播行为_第4张图片


另一个常用的传播属性 – Propagation.REQUIRES_NEW

  • 设置转账方法:
//转账
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void transfer(int money){
    //为了测试需要,先入账
    this.income("小明", money);
    //再出账
    this.outcome("小花", money);

    System.out.println("转账成功...");
}

其他的代码不变.

  • 测试结果:
    spring基础知识 (25):事务的传播行为_第5张图片
    这里写图片描述

账户余额发生了变动,第一次转账成功了。 这就是REQUIRES_NEW,将两次交易放在两个分开的事务中,各自完成各自的工作。
spring基础知识 (25):事务的传播行为_第6张图片

transfer方法是业务处理方法,本应该定义在sevice中的,但是为了验证REQUIRES_NEW,这里将之定义在了dao层。批量转账和转账两个方法必须在不同的类中REQUIRES_NEW才有效。


Propagation.SUPPORTS

这个常用于只进行查询的方法上


本系列参考视频教程: http://edu.51cto.com/course/1956.html

你可能感兴趣的:(spring)