Spring 中事務控制的API介紹

Spring 中事務控制的API介紹

 

一、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:是否讀取其餘提交增長後的數據,解決幻讀問題(在一個事務操做時,例外一個事務不能提交,也不能查詢)

髒讀,如圖所示:

不可重複讀,如圖所示:

幻讀,如圖所示:

相關文章
相關標籤/搜索