1. 程式人生 > >Spring 的程式設計式事務管理及宣告式事務管理--1

Spring 的程式設計式事務管理及宣告式事務管理--1

Spring 事務屬性分析

  事務管理對於企業應用而言至關重要。它保證了使用者的每一次操作都是可靠的,即便出現了異常的訪問情況,也不至於破壞後臺資料的完整性。就像銀行的自助取款機,通常都能正常為客戶服務,但是也難免遇到操作過程中機器突然出故障的情況,此時,事務就必須確保出故障前對賬戶的操作不生效,就像使用者剛才完全沒有使用過取款機一樣,以保證使用者和銀行的利益都不受損失。

  在 Spring 中,事務是通過 TransactionDefinition 介面來定義的。該介面包含與事務屬性有關的方法。具體如清單1所示:

  清單1. TransactionDefinition 介面中定義的主要方法

public interface TransactionDefinition{
int getIsolationLevel();
int getPropagationBehavior();
int getTimeout();
boolean isReadOnly();
}

也許你會奇怪,為什麼介面只提供了獲取屬性的方法,而沒有提供相關設定屬性的方法。其實道理很簡單,事務屬性的設定完全是程式設計師控制的,因此程式設計師可以自定義任何設定屬性的方法,而且儲存屬性的欄位也沒有任何要求。唯一的要求的是,Spring 進行事務操作的時候,通過呼叫以上介面提供的方法必須能夠返回事務相關的屬性取值。

  事務隔離級別

  隔離級別是指若干個併發的事務之間的隔離程度。TransactionDefinition 介面中定義了五個表示隔離級別的常量:

  TransactionDefinition.ISOLATION_DEFAULT:這是預設值,表示使用底層資料庫的預設隔離級別。對大部分資料庫而言,通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTED。

  TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個事務可以讀取另一個事務修改但還沒有提交的資料。該級別不能防止髒讀和不可重複讀,因此很少使用該隔離級別。

  TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個事務只能讀取另一個事務已經提交的資料。該級別可以防止髒讀,這也是大多數情況下的推薦值。

  TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個事務在整個過程中可以多次重複執行某個查詢,並且每次返回的記錄都相同。即使在多次查詢之間有新增的資料滿足該查詢,這些新增的記錄也會被忽略。該級別可以防止髒讀和不可重複讀。

  TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。但是這將嚴重影響程式的效能。通常情況下也不會用到該級別。