事务的传播行为

常见的事务传播行为主要有两种: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, 都会起一个自己的事务,所以当账户余额够买一本书的时候,会购买成功。

              

 

posted on 2016-05-01 15:35  我表情悠哉  阅读(159)  评论(0编辑  收藏  举报

导航