1、PlatformTransactionManager
Spring所有事務代理類都是基於PlatformTransactionManager接口的實現。
此接口是spring的事務管理器,它里面提供了我們常用的操作事務的方法,如下代碼片段:
PlatformTransactionManager包括以下三個操作:
//獲得事務信息
TransactionStatus getTransaction(TransactionDefinition definition) //提交事務
void commit(TransactionStatus status) //回滾事務
void rollback(TransactionStatus status)
我們在開發中都是使用它的實現類,如下:
1 //用於Spring JDBC以及Mybatis框架的事務代理
2 DataSourceTransactionManager 3 //用於Hibernate框架事務代理
4 HibernateTransactionManager 5 //用於Jpa框架的事務代理
6 JpaTransactionManager 7 //用於JDO框架的事務代碼
8 JdoTransactionManager 9 //用於Jta事務代理,一個事務跨多資源必須要使用
10 JtaTransactionManager
2、TransactionDefinition接口
① TransactionDefinition 源碼
1 public interface TransactionDefinition { 2 //事務的傳播行為 3 int PROPAGATION_REQUIRED = 0; 4 int PROPAGATION_SUPPORTS = 1; 5 int PROPAGATION_MANDATORY = 2; 6 int PROPAGATION_REQUIRES_NEW = 3; 7 int PROPAGATION_NOT_SUPPORTED = 4; 8 int PROPAGATION_NEVER = 5; 9 int PROPAGATION_NESTED = 6; 10 //事務的隔離級別 11 int ISOLATION_DEFAULT = -1; 12 int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED; 13 int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED; 14 int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ; 15 int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE; 16 int TIMEOUT_DEFAULT = -1; 17 //獲得事務信息 18 int getPropagationBehavior(); 19 int getIsolationLevel(); 20 int getTimeout(); 21 boolean isReadOnly(); 22 String getName(); 23 }
② 說明
TransactionDefinition是事務定義接口,該接口注意定義了:事務的傳播行為,事務的隔離級別,獲得事務信息的方法。所以在配置事務的傳播行為,事務的隔離級別已經需要獲得事務信息時,可以通過查閱該類的代碼獲得相關信息。
③ 事務的傳播行為
問題:事務的傳播行為是什么?
答:我們的業務程序,是通過方法調用另一個方法的。所謂的Spring事務的傳播行為,就是指將上一個方法定義的事務處理,是否傳遞到下一個方法的幾種情況。
問題:為什么會出現事務的傳播行為?
答:原因是因為在處理業務的時候,一條線程有可能出現多個事務處理對象!!事務的傳播行為就是用於描述,出現多個事務對象的時候,它們的關系是怎樣的!!
REQUIRED:如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。一般的選擇(默認值)99%
SUPPORTS:支持當前事務,如果當前沒有事務,就以非事務方式執行(沒有事務)
MANDATORY:使用當前的事務,如果當前沒有事務,就拋出異常
REQUERS_NEW:新建事務,如果當前在事務中,把當前事務掛起。
//查詢的時候配置
NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起
//查詢的時候配置
NEVER:以非事務方式運行,如果當前存在事務,拋出異常
NESTED:如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行REQUIRED類似的操作。
就是:出現多個事務(操作)時,通過事務的傳播行為來設置事務與事務之間的存在關系。
④ 事務隔離級別
所謂的事務隔離級別就是,同一個數據庫出現多個不同的線程操作(事務)。每個事務之間的關系就是事務隔離級別。
MySQL查詢數據庫當前的隔離級別的語句為:select @@tx_isolation;
ISOLATION_DEFAULT:默認隔離級別,由數據庫本身決定以下四種中的某一種。
根據現實情況,事務隔離級別有四個。
根據四個隔離級別,可能會出現,臟讀,不可重復讀,幻讀
ISOLATION_READ_UNCOMMITTED:可以讀取另一個事務未提交的數據
(一個事務操作時,另一個事務可以查詢,也可以提交,還可以讀取別的事務沒有提交的數據)
ISOLATION_READ_COMMITTED :只能讀已提交的數據,(解決臟讀問題,ORACLE默認)
(一個事務操作(增刪改)時,另一個事務可以查詢,也可以提交,但是不能讀取別的是沒有提交的數據)
ISOLATION_REPEATABLE_READ:是否讀取其他事務提交修改后的數據,解決不可以重復讀問題(MySQL默認)(在一個事務操作時,另外一個事務不能提交,但是可以查詢,適合!!!)
ISOLATION_SERIALIZABLE:是否讀取其他提交增加后的數據,解決幻讀問題(在一個事務操作時,例外一個事務不能提交,也不能查詢)
臟讀,如圖所示:
不可重復讀,如圖所示:
幻讀,如圖所示: