1. 程式人生 > >事務的5個隔離級別和7個傳播行為

事務的5個隔離級別和7個傳播行為

隔離級別:

1、ISOLATION_DEFAULT:

預設的隔離級別,使用資料庫預設的事務隔離級別 . 另外四個與 JDBC 的隔離級別相對應

2、ISOLATION_READ_UNCOMMITTED:

這是事務最低的隔離級別,它充許別外一個事務可以看到這個事務未提交的資料。這種隔離級別會產生髒讀,不可重複讀和幻像讀。

3、ISOLATION_READ_COMMITTED:

保證一個事務修改的資料提交後才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的資料。這種事務隔離級別可以避免髒讀出現,但是可能會出現不可重複讀和幻像讀。

4、ISOLATION_REPEATABLE_READ:

這種事務隔離級別可以防止髒讀,不可重複讀。但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的資料外,還保證了避免下面的情況產生 ( 不可重複讀 ) 。

5、ISOLATION_SERIALIZABLE:

這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。除了防止髒讀,不可重複讀外,還避免了幻像讀。

事務的傳播行為:

1、 PROPAGATION_REQUIRED 

如果存在一個事務,則支援當前事務。如果沒有事務則開啟一個新的事務。

2、PROPAGATION_SUPPORTS

如果存在一個事務,支援當前事務。如果沒有事務,則非事務的執行。

3、PROPAGATION_MANDATORY

如果已經存在一個事務,支援當前事務。如果沒有一個活動的事務,則丟擲異常。 當單獨呼叫 methodB 時,因為當前沒有一個活動的事務,則會丟擲異常 throw new IllegalTransactionStateException("Transaction propagation ''mandatory'' but no existing transaction found"); 當呼叫 methodA 時, methodB 則加入到 methodA 的事務中,事務地執行。

4、PROPAGATION_REQUIRES_NEW

總是開啟一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。

5、PROPAGATION_NOT_SUPPORTED

總是非事務地執行,並掛起任何存在的事務。 當單獨呼叫 methodB 時,不啟用任何事務機制,非事務地執行。  

6、PROPAGATION_NEVER

總是非事務地執行,如果存在一個活動事務,則丟擲異常 單獨呼叫 methodB ,則非事務的執行。 呼叫 methodA 則會丟擲異常

7、PROPAGATION_NESTED

如果一個活動的事務存在,則執行在一個巢狀的事務中 .如果沒有活動事務 , 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行 這是一個巢狀事務 , 使用 JDBC 3.0 驅動時 , 僅僅支援 DataSourceTransactionManager 作為事務管理器。