一. TransactionDefinition接口中定義了五個不同的事務隔離級別
1. ISOLATION_DEFAULT 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.另外四個與JDBC的隔離級別相對應
2. ISOLATION_READ_UNCOMMITTED 這是事務最低的隔離級別,它充許別外一個事務可以看到這個事務未提交的數據。這種隔離級別會產生髒讀,不可重複讀和幻像讀。(未提交讀 UR)
3. ISOLATION_READ_COMMITTED 保證一個事務修改的數據提交後才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。這種事務隔離級別可以避免髒讀出現,但是可能會出現不可重複讀和幻像讀。 (遊標穩定性 CS)
4. ISOLATION_REPEATABLE_READ 這種事務隔離級別可以防止髒讀,不可重複讀。但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重複讀)。(讀穩定性 RS)
5. ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理爲順序執行。除了防止髒讀,不可重複讀外,還避免了幻像讀。(不可重複讀 RR)
隔離級別 |
存取未落實數據 |
重複讀 |
幻想讀 |
讀穩定性 RS |
不可能 |
不可能 |
不可能 |
讀穩定性 RS |
不可能 |
不可能 |
可能 |
遊標穩定性 CS |
不可能 |
可能 |
可能 |
未提交讀 UR |
可能 |
可能 |
可能 |
DEFAULT |
數據庫默認的事務隔離級別 |
二. 在TransactionDefinition接口中定義了七個事務傳播行爲。
PROPAGATION_REQUIRED = 0 如果存在一個事務,則支持當前事務。如果沒有事務則開啓一個新的事務。
PROPAGATION_REQUIRES_NEW = 3 總是開啓一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。
PROPAGATION_SUPPORTS = 1 如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。但是對於事務同步的事務管理器,PROPAGATION_SUPPORTS與不使用事務有少許不同。
PROPAGATION_NOT_SUPPORTED = 4 總是非事務地執行,並掛起任何存在的事務。
PROPAGATION_MANDATORY = 2 -- 支持當前事務,如果當前沒有事務,就拋出異常。
PROPAGATION_NEVER = 5 總是非事務地執行,如果存在一個活動事務,則拋出異常
PROPAGATION_NESTED = 6 如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行
PROPAGATION_NESTED 與PROPAGATION_REQUIRES_NEW的區別:它們非常類似,都像一個嵌套事務,如果不存在一個活動的事務,都會開啓一個新的事務。使用PROPAGATION_REQUIRES_NEW時,內層事務與外層事務就像兩個獨立的事務一樣,一旦內層事務進行了提交後,外層事務不能對其進行回滾。兩個事務互不影響。兩個事務不是一個真正的嵌套事務。同時它需要JTA事務管理器的支持。
使用PROPAGATION_NESTED時,外層事務的回滾可以引起內層事務的回滾。而內層事務的異常並不會導致外層事務的回滾,它是一個真正的嵌套事務。DataSourceTransactionManager使用savepoint支持PROPAGATION_NESTED時,需要JDBC 3.0以上驅動及1.4以上的JDK版本支持。其它的JTA TrasactionManager實現可能有不同的支持方式。
PROPAGATION_REQUIRES_NEW 完全是一個新的事務, 而 PROPAGATION_NESTED 則是外部事務的子事務
PROPAGATION_REQUIRED應該是我們首先的事務傳播行爲。它能夠滿足我們大多數的事務需求。