多语言展示
当前在线:1494今日阅读:197今日分享:19

spring学习(34)-事务的传播行为(3)

今天小编继续学习spring,今天继续学习spring中事务的传播行为,小编这里通过实验的方式来说明事务传播行为。
工具/原料
1

电脑一台

2

eclipse

方法/步骤
1

首先小编这里创建三张表,一张account账户表,存放用户以及用户余额,一张book书表,存放书的编号、名称以及单价,一张book_stock书库存表,存放书的编号和对应的库存,从表中可以知道,如果用户想要买两本书的话,余额不足够购买两本书,如下图:

2

下图是小编的spring的java项目目录结构,比之前多了一个Cashier的接口以及Cashier接口的实现类CashierImpl,如下图:

3

下图是之前BookShopServiceImpl类,这里有一个购买书的实现方法,并加事务注解,使用propagation属性指定当前事务的传播行为为REQUIRED,如果不加propagation属性,那么事务默认也是REQUIRED,这个表示当有另一个事务调用当前事务的时候,使用调用方法的事务,如下图:

4

下图是之前CashierImpl类,这个类中的方法checkout中两次调用了purchase方法,这个方法是事务管理的,然后checkout方法也是事务管理的,如下图:

5

这里让用户购买两本书,但是用户的余额只够购买一本书,看是否用户可以购买成功,或者能成功购买一本书,如下图:

6

可以在junit中看到报【余额不足】,如下图:

7

查看数据库中可以看到,用户的余额够购买一本书,但是由于配置propagation属性指定当前事务的传播行为为REQUIRED,所以使用了最外层的事务,即全部购买失败,如下图:

8

修改BookShopServiceImpl类中事务的propagation属性,使propagation属性值为REQUIRES_NEW,这个值表示如果另外一个事务调用当前事务的时候,当前事务使用自己的事务而不使用调用方法的事务,如下图:

9

可以在junit中看到报【余额不足】,如下图:

10

查看数据库中可以看到,用户的余额够购买一本书,因为配置propagation属性指定当前事务的传播行为为REQUIRES_NEW,所以使用了最自己的事务,用户购买一本书成功,购买另外一本书的时候由于余额不足失败,如下图:

注意事项
1

个人观点,仅供参考。

2

感谢阅读。

推荐信息