交易是的特性之一是原子(Atomic)操作的工作單元,以資料庫存取的實例來說,就是一組SQL指令,這一組SQL指令必須全部執行成功,若因為某個原因(例如其中一行SQL有錯誤),則先前所有執行過的SQL指令撤消。
舉個簡單的例子,一個客戶從A銀行轉帳至B銀行,要作的動作為從A銀行的帳戶扣款、在B銀行的帳戶加上轉帳的金額,兩個動作必須成功,如果有一個動作失敗,則此次轉帳失敗。
在JDBC中,可以操作Connection的setAutoCommit()方法,給定它false引數,在下達一連串的SQL語句後,自行呼叫Connection的commit()來送出變更,如果中間發生錯誤,則呼叫rollback()來撤消所有的執行,例如:
try {
.....
connection.setAutoCommit(false);
.....
// 一連串SQL操作
connection.commit();
} catch(SQLException) {
// 發生錯誤,撤消所有變更
connection.rollback();
}
.....
connection.setAutoCommit(false);
.....
// 一連串SQL操作
connection.commit();
} catch(SQLException) {
// 發生錯誤,撤消所有變更
connection.rollback();
}
在Spring中對JDBC的交易管理加以封裝,Spring交易管理的抽象其關鍵在於org.springframework.transaction.PlatformTransactionManager介面的實現:
...
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition
definition) throws TransactionException;
void commit(TransactionStatus status)
throws TransactionException;
void rollback(TransactionStatus status)
throws TransactionException;
}
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition
definition) throws TransactionException;
void commit(TransactionStatus status)
throws TransactionException;
void rollback(TransactionStatus status)
throws TransactionException;
}
PlatformTransactionManager介面有許多具體的交易實現類別,例如DataSourceTransactionManager、 HibernateTransactionManager、JdoTransactionManager、JtaTransactionManager 等,藉由依賴於PlatformTransactionManager介面及各種的技術實現,Spring在交易管理上可以讓開發人員使用一致的編程模 型,即使使用的是不同的交易管理技術。
TransactionException是Unchecked Exception的。 交易的失敗通常都是致命的錯誤,Spring不強迫您一定要處理,而讓您自行選擇是否要捕捉例外。
getTransaction()方法根據一個TransactionDefinition物件來返回一個TransactionStatus物件, TransactionDefinition介面的實例定義了交易的隔離程度(Isolation level)、傳播行為(Propagation behavior)、超時(Timeout)、唯讀(Read-only)等,TransactionStatus代表著一個新的交易發起或已經存在的交 易,您可以藉由它控制交易的執行或調查交易的狀態:
...
public interface TransactionStatus {
boolean isNewTransaction();
void setRollbackOnly();
boolean isRollbackOnly();
}
public interface TransactionStatus {
boolean isNewTransaction();
void setRollbackOnly();
boolean isRollbackOnly();
}
Spring提供編程式的交易管理(Programmatic transaction management)與宣告式的交易管理(Declarative transaction management):
- 編程式的交易管理
編程式的交易管理讓您可以清楚的控制交易的邊界,也就是讓您自行實現交易何時開始、撤消操作的時機、交易何時結束等,可以實現細粒度的交易控制。
- 宣告式的交易管理
然而多數的情況下,交易並不需要細粒度的控制,採用宣告式的交易管理,好處是Spring交易管理的相關API可以不用介入程式之中,從物件的角度來看,並不知道它正被納入交易管理之中,在不需要交易管理的時候,只要在設定檔案上修改一下設定,即可移去交易管理服務。