(Spring)Spring框架的事務管理
事務的回顧
1、事務:指的是邏輯上一組操作,組成這個事務的各個執行單元,要麼都成功,要麼都失敗!!!
2、事務的特性
* 原子性
* 一致性
* 隔離性
* 永續性
3、如果不考慮隔離性,引發安全性問題
* 讀問題:
> 髒讀
> 不可重複讀
> 虛讀
* 寫問題:
> 丟失更新
4、如何解決安全性問題
* 讀問題解決,設定資料庫隔離級別
* 寫問題解決可以使用 悲觀鎖 和 樂觀鎖 的方式解決
Spring框架的事務管理相關的類和API
1、PlatformTransactionManager 介面 --- 平臺事務管理器(真正管理事務的類)。該介面有具體的實現類,根據不同的持久層框架,需要選擇不同的實現類
2、TransactionDefinition 介面 --- 事務定義資訊(事務的隔離級別、傳播行為、超時、只讀)
3、TransactionStatus 介面
4、總結:上述物件之間的關係,平臺事務管理真正管理事務物件。根據事務定義的資訊TransactionDefinition 進行事務管理,在管理事務中產生一些狀態。將狀態記錄到TransactionStatus中;
5、PlatformTransactionManager 介面中實現類和常用的方法
> 介面的實現類
* 如果使用的Spring的JDBC模板或者MyBatis框架,需要選擇DataSourceTransactionManager實現類
* 如果使用的是Hibernate的框架,需要選擇HibernateTransactionManager實現類
> 該介面的常用方法
* void commit(TransactionStatus status)
* TransactionStatus getTransaction(TransactionDefinition definition)
* void rollback(TransactionStatus status)
6、TransactionDefinition
> 事務隔離級別的常量
* static int ISOLATION_DEFAULT --- 採用資料庫的預設隔離級別
* static int ISOLATION_READ_UNCOMMITTED
* static int ISOLATION_READ_COMMITED
* static int ISOLATION_REPEATABLE_READ
* static int ISOLATION_SERIALIZABLE
> 事務的傳播行為常量(一般不用設定,使用預設值)
* 什麼是事務的傳播行為:解決的是業務層之間的方法呼叫!!!
* PROPAGATION_REQUIRED(預設值) --- A中有事務,使用A中的事務。如果沒有事務,B就會開啟一個新的事務,將A包含進來(保證A,B在同一個事務中)
* PROPAGATION_SUPPORTS --- A中有事務,使用A中的事務。如果A中沒有事務,那麼B也不使用事務
* PROPAGATION_MANDATORY --- A中有事務,使用A中的事務。如果A沒有事務,丟擲異常
* PROPAGATION_REQUIRES_NEW(記) --- A中有事務,將A中的事務掛起。B建立一個新的事務(保證A,B沒有在一個事務中)
* PROPAGATION_NOT_SUPPORTED --- A中有事務,將A中的事務掛起
* PROPAGATION_NEVER --- A中有事務,丟擲異常
* PROPAGATION_NESTED(記) --- 巢狀事務。當A執行之後,就會在這個位置設定一個儲存點。如果B沒有問題,執行通過。如果B出現異常,執行客戶根據需求回滾(選擇回滾到儲存點或者是最初始狀態)