Spring使用AOP來完成宣告式的交易管理,因而宣告式交易是以方法為單位,Spring的交易屬性(Transaction attribute)自然就在於描述交易應用至方法上的策略,在Spring中交易屬性可設定以下的幾個參數:
- 傳播行為(Propagation behavior)
傳播行為定義了交易應用於方法上之邊界(Boundaries),它告知何時該開始一個新的交易,或何時交易該被暫停,或者方法是否要在交易中進行。
當客戶端本身不在交易中,而呼叫另一個方法時,該方法可能:
- 在非交易中進行
- 啟始新的交易並於其中執行
- 丟出例外
當客戶端本身在交易中,而呼叫另一個方法時,該方法可能:
- 在客戶端的交易中進行
- 啟始新的交易並於其中執行
- 暫停客戶端交易,於非交易環境中執行
- 丟出例外
Spring定義幾個傳播行為,可在TransactionDefinition的API文件說明上找到相對應的常數與說明,以下列出幾個:
交易區間策略 |
說明 |
PROPAGATION_REQUIRED | 支援現在的交易,如果沒有的話就建立一個新的交易 |
PROPAGATION_REQUIRES_NEW | 建立一個新的交易,如果現存一個交易的話就先暫停,並啟始一個新的交易來執行 |
PROPAGATION_SUPPORTS | 支援現在的交易,如果沒有的話就以非交易的方式執行 |
PROPAGATION_MANDATORY | 方法必須在一個現存的交易中進行,否則丟出例外 |
PROPAGATION_NOT_SUPPORTED | 指出不應在交易中進行,如果有的話就暫停現存的交易 |
PROPAGATION_NEVER | 指出不應在交易中進行,如果有的話就丟出例外 |
PROPAGATION_NESTED | 在一個巢狀的交易中進行,如果不是的話,則同PROPAGATION_REQUIRED |
若客戶端本身不在交易中,而呼叫另一個方法時,依該方法設定的策略,而會有的行為對應如下:
- 在非交易中進行(SUPPORTS、NOT_SUPPORTED、NEVER)
- 啟始新的交易並於其中執行(REQUIRED、REQUIRES_NEW)
- 丟出例外(MANDATORY)
若客戶端本身在交易中,而呼叫另一個方法時,依該方法設定的策略,而會有的行為對應如下:
- 在客戶端的交易中進行(REQUIRED、SUPPORTS、MANDATORY)
- 暫停客戶端交易,啟始新的交易並於其中執行(REQUIRED_NEW)
- 暫停客戶端交易,於非交易環境中執行(NOT_SUPPORTED)
- 暫停客戶端交易,於非交易環境中執行(NOT_SUPPORTED)
- 丟出例外(NEVER)
- 隔離層級(Isolation level)
在一個應用程式中,可能有多個交易同時在進行,這些交易應當彼此之間互相不知道另一個交易的存在,好比現在整個應用程式就只有一個交易存在的樣子,由於交易彼此之間獨立,若讀取的是同一個資料的話,就容易發生問題,您可以參考 簡
介隔離層級 的說明。
Spring提供了幾種隔離層級設定,同樣的可以在TransactionDefinition的API文件說明上找到相對應的常數與說明,以下列出幾個:
隔離層級 |
說明 |
ISOLATION_DEFAULT
|
使用底層資料庫預設的隔離層級 |
ISOLATION_READ_COMMITTED
|
允許交易讀取其它並行的交易已經送出(Commit)的資料欄位,可以防止Dirty
read問題 |
ISOLATION_READ_UNCOMMITTED
|
允許交易讀取其它並行的交易還沒送出的資料,會發生Dirty、Nonrepeatable、Phantom
read等問題 |
ISOLATION_REPEATABLE_READ
|
要求多次讀取的資料必須相同,除非交易本身更新資料,可防止Dirty、Nonrepeatable
read問題 |
ISOLATION_SERIALIZABLE |
完整的隔離層級,可防止Dirty、Nonrepeatable、Phantom
read等問題,會鎖定對應的資料表格,因而有效能問題 |
- 唯讀提示(Read-only hints)
如果交易只進行讀取的動作,則可以利用底層資料庫在唯讀操
作時的一些最佳化動作,由於這個動作利用到資料庫在唯讀的交易操作最佳化,因而必須在交易中才有效,也就是說您要搭配傳播行為
PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、 PROPAGATION_NESTED來設置。
- 交易超時期間(The transaction timeout period)
有的交易操作可能延續一段很長的時間,交易本身可能關聯到資料表格的鎖定,因而長時間的交易操作會有效能上的問題,對於過長的交易操作,您要考慮回滾(Roll back)交易並要求重新操作,而不是無限時的等待交易完成。
您可以設置交易超時期間,計時是從交易開始時,所以這個設置必須搭配傳播行為PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED來設置。
您可以設置交易超時期間,計時是從交易開始時,所以這個設置必須搭配傳播行為PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED來設置。