2011-04-05 84 views
8

我正在使用基於註釋的聲明式方法來處理spring aop。 示例代碼交易的傳播行爲

ClassA{ 
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) 
add() 
{ 
method1(); 
method2(); 
method3(); 

} 
} 

但我仍然懷疑在使用propagation.does的propagation.Requires_New意味着每個請求將開始新的事務。

第二個問題:

是否像方法2的任何方法的失敗,方法3將導致事務回滾?

如果有人能幫助我傾向交易傳播,我會非常高興。

有人可以爲我提供一個真實世界的例子,我們需要參與現有的事務。因爲我想象上面例子中使用的add函數將獨立於所有用戶,或者任何其他函數都將獨立於每個函數正在呼叫的用戶。我無法找到使用其他傳播行爲(如PROPAGATION_SUPPORTS,PROPAGATION_MANDATORY,PROPAGATION_REQUIRES_NEW等)的示例

回答

31

回答這個評論,而不是實際的問題:

交易是會話特定或 具體要求 - Vish 2小時前

都不是。請求和會話都是特定於Web的範圍,而Spring Transaction抽象與Web技術無關。

@Transactional的範圍是按方法調用的,因爲@Transactional是通過Spring AOP實現的。事務狀態保存在ThreadLocal變量中,當最外面的@Transactional方法被輸入時,該變量被初始化,並在離開時被提交或回滾清除。整個抽象在Java方法級別上工作,因此不需要或從Web容器中獲利。


而在回答這個問題在下面的評論:

感謝@肖恩,我是還是老樣子沒能獲得 答案在其它傳播 行爲像PROPAGATION_SUPPORTS ,PROPAGATION_MANDATORY,PROPAGATION_REQUIRES_NEW 等等。請參考上面 整個問題

這裏的Propagation值與我的意見列表:

強制性
支持當前事務,如果 不存在拋出異常。

不開始一個新的事務處理,只檢查交易是否是活動的(必須是另一個@Transactional方法呼叫或編程方式創建的事務內部)

NESTED
執行內嵌套交易如果當前交易 存在,則表現得像 PROPAGATION_REQUIRED else。

如果事務存在,則啓動嵌套事務,否則啓動新的事務。

NEVER
執行非事務,如果事務 存在拋出異常。

不啓動交易。如果交易存在,則失敗。

NOT_SUPPORTED
執行非事務,如果一個 存在暫停當前事務。

不啓動交易。暫停任何現有的交易。

REQUIRED
支持當前事務,創造,如果沒有 存在一個新的。

如果存在事務,則使用該事務,如果沒有,則創建一個新事務。 95%的情況下,這是你需要的。

REQUIRES_NEW
創建一個新的事務,如果一個 存在暫停當前事務。

總是創建一個新的事務,無論是否存在現有的事務。如果存在,它將在此方法執行期間暫停。

SUPPORTS
支持當前事務,執行 非事務如果不存在。

可以使用事務如果存在,但並不需要一個(也不會開始一個新的)


在大多數情況下,REQUIRED是你所需要的(因此這是@Transactional註釋中的默認值)。我個人從未見過任何其他值,但REQUIREDREQUIRES_NEW正在使用中。

+0

謝謝@ sean,我仍然無法獲得其他傳播行爲,如PROPAGATION_SUPPORTS,PROPAGATION_MANDATORY,PROPAGATION_REQUIRES_NEW等等。請參考上面的整個問題 – Vish 2011-04-06 06:23:38

+0

Thanks @ Sean.so如果多個請求都調用相同的方法說ADD(),REQUIRED註釋會使它們在同一個事務中運行??但我認爲所有的Add()方法調用都會在交易方面彼此獨立..仍然有點混亂 – Vish 2011-04-06 11:21:17

+1

@Vish不,從不。新的請求總是意味着在新線程中新的方法調用,因此是新的事務。所有這些事務性的東西都發生在一個方法調用中,即最外面的一個。當外部方法調用內部事務方法時,會變得棘手,但調用外部方法兩次意味着兩個事務,無論它是否在Web上下文中。 – 2011-04-06 13:19:19

0

是的。 Requires_New表示每個請求都會啓動新的事務。如果method2中的方法失敗,方法3將導致事務回滾,具體取決於回滾屬性。 檢查Transactional屬性。

+0

交易是會話特定的或請求特定的 – Vish 2011-04-05 11:16:27

1

事務傳播指示調用時給定方法的行爲應該是什麼。 REQUIRES_NEW意味着即使存在正在進行的交易,也應始終開始新的交易。

例如,如果method1()定義爲REQUIRES_NEW,則它將在新事務中執行。

異常會回滾當前活動事務,是的。