事務的傳播行爲

常見的事務傳播行爲主要有兩種:REQUIRED 和 REQUIRES_NEWjava

  • REQUIRED
    • 當bookService 的purchase() 方法被另外一個事務方法chechout() 調用時,它默認會在現有事務中運行,這個默認的傳播行爲就是REQUIRED。所以checkout() 方法的開始和終止邊界內只有一個事務,這個事務只在checkout() 方法結束的時候被提交,結果用戶一本書都買不了
    • 事務傳播屬性能夠在這麼定義:
      @Transactional(propagation = Propagation.REQUIRES_NEW,
      isolation=Isolation.READ_COMMITTED, readOnly=false, timeout=3)
      

      也能夠經過 xml 的方式定義:xml

          <tx:advice id="txAdvice" transaction-manager="transactionManager">
              <tx:attributes>
                  <!-- 根據方法名指定事務的屬性 -->
                  <tx:method name="purchase" propagation="REQUIRED"/>
                  <tx:method name="*"/>
              </tx:attributes>
          </tx:advice>
      

    只有一個事務,因此即使帳戶的餘額夠一本書,最後也會所有回滾:blog

  

  • REQUIRES_NEW
    • 表示該方法必須啓動一個新事務,並在本身的事務內運行,若是有事務在運行,就必須將它掛起
    • 如圖所示,當chechout 調用purchase 的時候,每一次調用 purchase, 都會起一個本身的事務,因此當帳戶餘額夠買一本書的時候,會購買成功。

              

 

相關文章
相關標籤/搜索