Spring 中事務控制的API介紹


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

臟讀,如圖所示:

不可重復讀,如圖所示:

幻讀,如圖所示:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM