电脑一台
eclipse
首先小编这里创建三张表,一张account账户表,存放用户以及用户余额,一张book书表,存放书的编号、名称以及单价,一张book_stock书库存表,存放书的编号和对应的库存,从表中可以知道,如果用户想要买两本书的话,余额不足够购买两本书,如下图:
下图是小编的spring的java项目目录结构,比之前多了一个Cashier的接口以及Cashier接口的实现类CashierImpl,如下图:
下图是之前BookShopServiceImpl类,这里有一个购买书的实现方法,并加事务注解,使用propagation属性指定当前事务的传播行为为REQUIRED,如果不加propagation属性,那么事务默认也是REQUIRED,这个表示当有另一个事务调用当前事务的时候,使用调用方法的事务,如下图:
下图是之前CashierImpl类,这个类中的方法checkout中两次调用了purchase方法,这个方法是事务管理的,然后checkout方法也是事务管理的,如下图:
这里让用户购买两本书,但是用户的余额只够购买一本书,看是否用户可以购买成功,或者能成功购买一本书,如下图:
可以在junit中看到报【余额不足】,如下图:
查看数据库中可以看到,用户的余额够购买一本书,但是由于配置propagation属性指定当前事务的传播行为为REQUIRED,所以使用了最外层的事务,即全部购买失败,如下图:
修改BookShopServiceImpl类中事务的propagation属性,使propagation属性值为REQUIRES_NEW,这个值表示如果另外一个事务调用当前事务的时候,当前事务使用自己的事务而不使用调用方法的事务,如下图:
可以在junit中看到报【余额不足】,如下图:
查看数据库中可以看到,用户的余额够购买一本书,因为配置propagation属性指定当前事务的传播行为为REQUIRES_NEW,所以使用了最自己的事务,用户购买一本书成功,购买另外一本书的时候由于余额不足失败,如下图:
个人观点,仅供参考。
感谢阅读。