1. 程式人生 > >spring事物的7個傳播行為

spring事物的7個傳播行為

@Transactional之propagation

     Propagation支援7種不同的傳播機制:

     REQUIRED -- required

               業務方法需要在一個事務中執行,如果方法執行時,已處在一個事務中,那麼就加入該事務,否則自己建立一個新的事務.這是spring預設的傳播行為.。

     SUPPORTS:  -- supports

               如果業務方法在某個事務範圍內被呼叫,則方法成為該事務的一部分,如果業務方法在事務範圍外被呼叫,則方法在沒有事務的環境下執行。

     MANDATORY: -- mandatory

               只能在一個已存在事務中執行,業務方法不能發起自己的事務,如果業務方法在沒有事務的環境下呼叫,就拋異常

     REQUIRES_NEW -- requires_new

             業務方法總是會為自己發起一個新的事務,如果方法已執行在一個事務中,則原有事務被掛起,新的事務被建立,直到方法結束,新事務才結束,原先的事務才會恢復執行.

     NOT_SUPPORTED -- not_supported

           宣告方法需要事務,如果方法沒有關聯到一個事務,容器不會為它開啟事務.如果方法在一個事務中被呼叫,該事務會被掛起,在方法呼叫結束後,原先的事務便會恢復執行.

    NEVER: -- never

              宣告方法絕對不能在事務範圍內執行,如果方法在某個事務範圍內執行,容器就拋異常.只有沒關聯到事務,才正常執行.

     NESTED:--nested

          如果一個活動的事務存在,則執行在一個巢狀的事務中.如果沒有活動的事務,則按REQUIRED屬性執行.它使用了一個單獨的事務, 這個事務擁有多個可以回滾的保證點.
          內部事務回滾不會對外部事務造成影響, 它只對DataSourceTransactionManager 事務管理器起效.

     其實大家最感到困惑的是REQUIRED_NEW和NESTED兩種不同的傳播機制,功能類似,都涉及到了事務巢狀的問題,那兩者有何區別呢?該如何正確使用這兩種模式呢?
        以下是摘自Spring的文件:
        PROPAGATION_REQUIRES_NEW :
            uses a completely independent transaction for each affected transaction scope.
            In that case, the underlying physical transactions are different and hence can commit or roll back independently,
            with an outer transaction not affected by an inner transaction's rollback status.
            內部的事務獨立執行,在各自的作用域中,可以獨立的回滾或者提交;而外部的事務將不受內部事務的回滾狀態影響。
            
        ROPAGATION_NESTED :
            uses a single physical transaction with multiple savepoints that it can roll back to.
            Such partial rollbacks allow an inner transaction scope to trigger a rollback for its scope,
            with the outer transaction being able to continue the physical transaction despite some operations having been rolled back.
            This setting is typically mapped onto JDBC savepoints, so will only work with JDBC resource transactions.
            
            NESTED的事務,基於單一的事務來管理,提供了多個儲存點。
            這種多個儲存點的機制允許內部事務的變更觸發外部事務的回滾。而外部事務在混滾之後,仍能繼續進行事務處理,即使部分操作已經被混滾。
            由於這個設定基於JDBC的儲存點,所以只能工作在JDBC的機制智商。
            
       由此可知, 兩者都是事務巢狀,不同之處在於,內外事務之間是否存在彼此之間的影響;NESTED之間會受到影響,而產生部分回滾,而REQUIRED_NEW則是獨立的。