1. 程式人生 > >spring 事物隔離級別和傳播行為

spring 事物隔離級別和傳播行為

首先,要了解的是什麼是資料庫的隔離級別。在一個典型的應用中,併發是不可避免的,多個事務併發執行,操作同一個資料來完成任務。併發可能會導致以下問題:

髒讀(Dirty read):
髒讀發生在一個事務讀取了被另一個事務改寫但還未提交的資料時。如果這些改變在稍後被回滾,那麼之前的事務讀取的到資料就是無效的。

不可重複讀(Nonrepeatable read):
不可重複讀發生在一個事務執行相同的查詢兩次或兩次以上,但每一次的查詢結果不同時。這通常是由於另一個併發的事務在兩次查詢之間更新了資料。

幻讀(Phantom read):
幻讀是一個事務讀取幾行記錄後,另一個事務插入了一些記錄,幻讀就發生了。在後來的查詢中第一個事務就會發現有一些原來沒有的額外的記錄。

ISOLATION_DEFAULT:
使用資料庫預設的隔離級別。

ISOLATION_READ_UNCOMMITTED:
允許讀取改變了的還未提交的資料,可能導致髒讀、不可重複讀和幻讀。

ISOLATION_READ COMMITTED:
允許併發事務提交之後讀取,可以避免髒讀,可能導致重複讀和幻讀。

ISOLATION_REPEATABLE_READ:
對相同欄位的多次讀取結果一致,可導致幻讀。

ISOLATION_SERIALIZABLE:
完全服從ACID的原則,確保不發生髒讀、不可重複讀和幻讀。

可以根據自己的系統對資料的要求採取適應的隔離級別,因為隔離牽涉到鎖定資料庫中的記錄,對資料正性要求越嚴格,併發的效能也越差。

spring的事務傳播行為

spring事務的傳播行為說的是當一個方法呼叫另一個方法時,事務該如何操作。

PROPAGATION_MANDATORY:
該方法必須執行在一個事務中。如果當前事務不存在則丟擲異常。

PROPAGATION_NESTED:
如果當前存在一個事務,則該方法執行在一個巢狀的事務中。被巢狀的事務可以從當前事務中單獨的提交和回滾。如果當前不存在事務,則開始一個新的事務。各廠商對這種傳播行為的支援參差不齊,使用時需注意。

PROPAGATION_NEVER:
當前方法不應該執行在一個事務中。如果當前存在一個事務,則丟擲異常。

PROPAGATION_NOT_SUPPORTED:
當前方法不應該執行在一個事務中。如果一個事務正在執行,它將在該方法的執行期間掛起。

PROPAGATION_REQUIRED:
該方法必須執行在一個事務中。如果一個事務正在執行,該方法將執行在這個事務中。否則,就開始一個新的事務。

PROPAGATION_REQUIRES_NEW:
該方法必須執行在自己的事務中。它將啟動一個新的事務。如果一個現有的事務正在執行,將在這個方法的執行期間掛起。

PROPAGATION_SUPPORTS:
當前方法不需要事務處理環境,但如果一個事務已經在執行的話,這個方法也可以在這個事務裡執行。