Spring中事务的传播行为

来源:互联网 发布:巨型海报打印软件 编辑:程序博客网 时间:2024/06/06 08:43
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播.例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行.
事务的传播行为可以由传播属性指定.Spring定义了7  种类传播行为:



先来看一下第一中传播方式的示意图:


整个过程只有一个事务,如果发生回滚,那么一起回滚~
随后,看一下REQURED_NEW方式的示意图:


整个过程中有多个事务,如果发生回滚,只有发生状况后的数据发生了回滚,而前面的数据则不会回滚。
EX:
创建一个Cashier类:
@Repositorypublic class CashierImp implements Cashier {    @Autowired    private BookShopService bookShopService;    @Transactional    public void checkout(String username, List<String> isbns) {        for(String isbn:isbns){            bookShopService.purchase(username,isbn);        }    }}
同时在booService中也有一个添加了事务声明的函数:
 @Transactional    public void purchase(String username, String isbn) {        //获取书的单价        int price=bookShopDao.findBookPriceByIsbn(isbn);        //更新书的库存        bookShopDao.updateBookStock(isbn);        //更新用户余额        bookShopDao.updateUserAccount(username,price);    }

如果采取默认的也就是第一种传播方式会怎样呢?
抛出异常的时候,数据库中的两行数据都不会发生改变

当我们使用REQUIRES_NEW 方式的时候:可以发现第一行的数据发生了改变,而第二行中的数据发生了回滚。




0 0
原创粉丝点击