一、PlatformTransactionManagerhtml
Spring全部事務代理類都是基於PlatformTransactionManager接口的實現。spring
此接口是spring的事務管理器,它裏面提供了咱們經常使用的操做事務的方法,以下代碼片斷:數據庫
PlatformTransactionManager包括如下三個操做:框架
//得到事務信息 TransactionStatus getTransaction(TransactionDefinition definition) //提交事務 void commit(TransactionStatus status) //回滾事務 void rollback(TransactionStatus status)
咱們在開發中都是使用它的實現類,以下:post
1 //用於Spring JDBC以及Mybatis框架的事務代理 2 DataSourceTransactionManager 3 //用於Hibernate框架事務代理 4 HibernateTransactionManager 5 //用於Jpa框架的事務代理 6 JpaTransactionManager 7 //用於JDO框架的事務代碼 8 JdoTransactionManager 9 //用於Jta事務代理,一個事務跨多資源必需要使用 10 JtaTransactionManager
二、TransactionDefinition接口spa
① 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 }
② 說明3d
TransactionDefinition是事務定義接口,該接口注意定義了:事務的傳播行爲,事務的隔離級別,得到事務信息的方法。因此在配置事務的傳播行爲,事務的隔離級別已經須要得到事務信息時,能夠經過查閱該類的代碼得到相關信息。代理
③ 事務的傳播行爲code
問題:事務的傳播行爲是什麼?
答:咱們的業務程序,是經過方法調用另外一個方法的。所謂的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:是否讀取其餘提交增長後的數據,解決幻讀問題(在一個事務操做時,例外一個事務不能提交,也不能查詢)
髒讀,如圖所示:
不可重複讀,如圖所示:
幻讀,如圖所示: