Spring 事務管理
數據庫事務是被當作單個工作單元的操作序列。這些操作要麼全部完成或全部不成功。事務管理是麵向企業應用程序,以確保數據的完整性和一致性RDBMS中的重要組成部分。事務的概念可以用下麵的描述為ACID四個關鍵屬性來描述:
-
原子性: 一個事務應該被視為單個操作單元表示的操作的任一整個序列是成功的或不成功的。
-
一致性: 這代表了數據庫的參照完整性,在桌等唯一主鍵的一致性
-
隔離性: 可能有很多事務處理相同的數據集的同時,每個事務都應由他人隔離,以防止數據損壞。
-
持久性: 一旦事務完成,本次事務的結果必須作出永久性的,不能從數據庫中刪除因係統故障。
一個真正的RDBMS數據庫係統將保證所有的四個屬性為每個事務。頒發給使用SQL數據庫的事務的簡單觀點如下:
-
使用begin transaction命令開始事務。
-
使用SQL查詢執行各種刪除,更新或插入操作。
-
如果所有的操作都成功,那麼執行提交,否則回滾所有操作。
Spring框架提供的不同的底層事務管理API之上的抽象層。在Spring的事務支持,旨在通過增加事務功能,的POJO提供EJB的替代品事務。 Spring支持兩種編程式和聲明式事務管理。需要的EJB應用程序服務器,但Spring事務管理,而不需要一個應用服務器來實現。
局部與全局事務
局部事務是針對像一個JDBC連接一個單一的事務性資源,而全局事務可以跨越像事務多個事務資源的分布式係統。
局部事務管理可以在一個集中式計算環境下的應用程序的組件和資源都位於一個單一的網站是有用的,而事務管理隻涉及一個單獨的機器上運行的本地數據管理。局部事務更容易實現。
全局事務管理,需要在分布在多個係統中的所有資源的分布式計算環境。在這種情況下,事務管理既需要在地方和全局層麵的工作要做。一個分布式或全局事務在多個係統上執行,其執行需要全局事務管理係統和所有相關係統的所有局部數據管理人員之間的協調。
編程與聲明
Spring支持兩種類型的事務管理:
聲明式事務管理要優於編程式事務管理,雖然它比編程式事務管理,它允許你通過代碼來控製事務不夠靈活。但作為一種橫切關注點的,聲明式事務管理可以用模塊化的AOP方法。Spring通過Spring AOP框架支持聲明式事務管理。
Spring事務抽象
關鍵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; }
S.N. | 方法 & 描述 |
---|---|
1 |
TransactionStatus getTransaction(TransactionDefinition definition) This method returns a currently active transaction or create a new one, according to the specified propagation behavior. |
2 |
void commit(TransactionStatus status) This method commits the given transaction, with regard to its status. |
3 |
void rollback(TransactionStatus status) This method performs a rollback of the given transaction. |
TransactionDefinition是在Spring中事務支持的核心接口,它的定義如下:
public interface TransactionDefinition { int getPropagationBehavior(); int getIsolationLevel(); String getName(); int getTimeout(); boolean isReadOnly(); }
S.N. | 方法 & 描述 |
---|---|
1 |
int getPropagationBehavior() This method returns the propagation behavior. Spring offers all of the transaction propagation options familiar from EJB CMT. |
2 |
int getIsolationLevel() This method returns the degree to which this transaction is isolated from the work of other transactions. |
3 |
String getName() This method returns the name of this transaction. |
4 |
int getTimeout() This method returns the time in seconds in which the transaction must complete. |
5 |
boolean isReadOnly() This method returns whether the transaction is read-only. |
下麵是隔離級彆可能的值:
S.N. | 隔離& 描述 |
---|---|
1 |
TransactionDefinition.ISOLATION_DEFAULT This is the default isolation level. |
2 |
TransactionDefinition.ISOLATION_READ_COMMITTED Indicates that dirty reads are prevented; non-repeatable reads and phantom reads can occur. |
3 |
TransactionDefinition.ISOLATION_READ_UNCOMMITTED Indicates that dirty reads, non-repeatable reads and phantom reads can occur. |
4 |
TransactionDefinition.ISOLATION_REPEATABLE_READ Indicates that dirty reads and non-repeatable reads are prevented; phantom reads can occur. |
5 |
TransactionDefinition.ISOLATION_SERIALIZABLE Indicates that dirty reads, non-repeatable reads and phantom reads are prevented. |
以下是針對Propagation 類型可能的值:
S.N. | 傳輸& 描述 |
---|---|
1 |
TransactionDefinition.PROPAGATION_MANDATORY Support a current transaction; throw an exception if no current transaction exists. |
2 |
TransactionDefinition.PROPAGATION_NESTED Execute within a nested transaction if a current transaction exists. |
3 |
TransactionDefinition.PROPAGATION_NEVER Do not support a current transaction; throw an exception if a current transaction exists. |
4 |
TransactionDefinition.PROPAGATION_NOT_SUPPORTED Do not support a current transaction; rather always execute non-transactionally. |
5 |
TransactionDefinition.PROPAGATION_REQUIRED Support a current transaction; create a new one if none exists. |
6 |
TransactionDefinition.PROPAGATION_REQUIRES_NEW Create a new transaction, suspending the current transaction if one exists. |
7 |
TransactionDefinition.PROPAGATION_SUPPORTS Support a current transaction; execute non-transactionally if none exists. |
8 |
TransactionDefinition.TIMEOUT_DEFAULT Use the default timeout of the underlying transaction system, or none if timeouts are not supported. |
TransactionStatus接口為處理事務的代碼來控製事務執行和查詢事務狀態的簡單方法。
public interface TransactionStatus extends SavepointManager { boolean isNewTransaction(); boolean hasSavepoint(); void setRollbackOnly(); boolean isRollbackOnly(); boolean isCompleted(); }
S.N. | 方法 & 描述 |
---|---|
1 |
boolean hasSavepoint() This method returns whether this transaction internally carries a savepoint, that is, has been created as nested transaction based on a savepoint. |
2 |
boolean isCompleted() This method returns whether this transaction is completed, that is, whether it has already been committed or rolled back. |
3 |
boolean isNewTransaction() This method returns true in case the present transaction is new. |
4 |
boolean isRollbackOnly() This method returns whether the transaction has been marked as rollback-only. |
5 |
void setRollbackOnly() This method sets the transaction rollback-only. |