事务的传播行为
常见的事务传播行为主要有两种:REQUIRED 和 REQUIRES_NEW
- REQUIRED
- 当bookService 的purchase() 方法被另一个事务方法chechout() 调用时,它默认会在现有事务中运行,这个默认的传播行为就是REQUIRED。因此checkout() 方法的开始和终止边界内只有一个事务,这个事务只在checkout() 方法结束的时候被提交,结果用户一本书都买不了
- 事务传播属性可以在这么定义:
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation=Isolation.READ_COMMITTED, readOnly=false, timeout=3)
也可以通过 xml 的方式定义:
<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 根据方法名指定事务的属性 --> <tx:method name="purchase" propagation="REQUIRED"/> <tx:method name="*"/> </tx:attributes> </tx:advice>
只有一个事务,所以即便账户的余额够一本书,最后也会全部回滚:
- REQUIRES_NEW
- 表示该方法必须启动一个新事务,并在自己的事务内运行,如果有事务在运行,就必须将它挂起
- 如图所示,当chechout 调用purchase 的时候,每一次调用 purchase, 都会起一个自己的事务,所以当账户余额够买一本书的时候,会购买成功。