Java事務——學習總結

在項目中遇到的一些關於事務的問題,而後通過查閱資料,再對事務作一些分析和總結。html

關於Spring事務,事務分兩種:spring

一、編程式事務sql

二、聲明式事務(應用註解的方式來使用事務,註解爲:@Transactional)數據庫

先說明,什麼是事務(MYSQL): MySQL每執行一條SQL語句,都是一個單獨的事務。若是須要在一個事務中包含多條SQL語句,那麼須要開啓事務和結束事務。 要麼成功,要麼失敗,其實有涉及到事務的特性,編程

即: 事務必須知足四個特性:springboot

原子性:一組事務,要麼成功,要麼撤回app

一致性:事務執行後,數據庫狀態與其餘 業務規則保持一致性。框架

隔離性:事務獨立運行。一個事務處理後的結果,影響了其餘事務,那麼其餘事務會撤回。代理

持久性(Durability):軟、硬件崩潰後,InnoDB數據表驅動會利用日誌文件重構修改日誌

關於編程式事務:

在strust2中,公司項目工程裏面,代碼都是直接封裝好的jar包,因此,一直都沒能好好觀察項目中的事務是怎麼操做的。先從外部代碼進行分析,其實最後都是大同小異。 從最外面一層開始看:

獲取數據源,dataSource,開啓鏈接,

開啓事務用的是TransactionSynchronizer,事務獲取鏈接,同時自動提交設置爲關閉,這是公司內部框架封裝好的集成,因此大概猜想功能也和Transaction註解同樣,開啓事務功能

獲取數據庫鏈接:

這裏講一下try catch finally ,程序執行的時候,try是必定會執行,當try執行的時候有錯誤的時候,執行catch語句,並拋出異常信息,再執行finally語句,

若是connection是本身新開的,須要在這個finally裏面關閉connection,點擊進入關閉方法,方法裏面幫咱們這個connection事務作了提交

在默認狀況下,MySQL每執行一條SQL語句,都是一個單獨的事務。若是須要在一個事務中包含多條SQL語句,那麼須要開啓事務和結束事務。

conn.commit(); //提交事務, conn.rollback();//回滾事務,

以上爲公司提交事務的時候,所須要用的方法和整個流程,我的認爲,和編程式事務,有點相似,不像聲明式事務直接註解,自動開啓事務。

回想起之前作的項目,發現本身歷來都沒有寫過關於事務的註解,沒用過編程式事務,也沒有用過註解式事務。

事務通常都加在service層,可是在項目中沒有找到Transctional註解,後來查資料才得知,其實事務和能不能保存數據沒有關係。

開啓事務只是說這個保存操做要手動commit之後纔會持久化到數據庫,沒有手動commit之前,能夠rollback。 未開啓事務是說只要一作save操做,數據立馬持久化到數據庫。

那麼問題來了,當沒有開始事務的時候,Mysql插入數據庫,若是中途出錯了,會怎麼樣?這時候事務的特性就顯現了,「事務是用來確保你插入的原子性的,不是用來確保成功率的。」事務的原子性,要麼成功要麼失敗。因此當插入的時候失敗了,那麼這條記錄插入不成功。

開啓事務支持,保持數據的一致性。

好的,瞭解完這個,繼續深刻了解編程式事務。 首先獲取TransactionTemplate 的核心方法

在經過實現此核心方法去實現和調用這個方法

好比:

使用一、直接new一個transactionCallback,而後再裏面編程,在覈心代碼方法會自動幫忙提交,

使用二、new出來之後直接調用方法

這麼看,編程式事務,其實挺麻煩的。

聲明式事務: 先在application.xml文件中配置,這個是基於Java,SSM框架配置掃描。

而後再service層對須要進行實物控制的方法加上註解@Transactional

以上爲xml版本的註解

如今來介紹關於springboot自動化註解

  1. @EnableTransactionManagement註解經過導入方式,在容器中註冊了兩個重要組件: AutoProxyRegistrar——至關於一個自定義組件註冊器,在容器中註冊了一個後置處理器; ProxyTransactionManagementConfiguration——是一個容器配置類,在其中註冊了事務加強器。 點進@EnableTransactionManagement註解內部, @Import中的那個類,實現了ImportsSelector接口,正是經過這個ImportSelector導入了上述兩個組件。

再進入TransactionManagementConfigurationSelector時候,構造了 AutoProxyRegistrar——至關於一個自定義組件註冊器,在容器中註冊了一個後置處理器; ProxyTransactionManagementConfiguration——是一個容器配置類,在其中註冊了事務加強器。

這兩個組件的實現原理,有點難。抱歉,實在懟不動,以上兩個組件原理本人蔘考 www.cnblogs.com/dubhlinn/p/… 有興趣的盆友能夠親自去看看 看下關於原理的總結,

  1. 在容器配置類上使用@EnableTransactionManagement註解,該註解在容器中註冊了兩大組件——AutoProxyRegistrar、ProxyTransactionManagementConfiguration;
  2. AutoProxyRegistrar經過導入方式在容器中註冊了InfrastructureAdvisorAutoProxyCreator,這是一個後置處理器;
  3. ProxyTransactionManagementConfiguration自己就是一個容器配置類,它註冊了transactionAdvisor(事務加強器),而後又在這個事務加強器中注入了兩個屬性transactionAttributeSource、transactionInterceptor;
  4. transactionAttributeSource用於解析@Transactional註解的各類屬性;
  5. transactionInterceptor實現了MethodInterceptor,是一個攔截器鏈,這個攔截器鏈會從容器中獲取事務管理器,利用事務管理器,在目標方法發生異常時執行回滾,在目標發生正常完成後提交事務;
  6. 第2步的InfrastructureAdvisorAutoProxyCreator後置處理器,會在目標對象建立完成以後將其包裝爲代理對象,代理對象在執行目標方法時會首先獲取攔截器鏈,這個攔截器鏈就是第5步的transactionInterceptor。

仍是看下怎麼用吧, 利用config過濾器創建關於數據庫鏈接, 開啓事務,

而後用法同配置xml方式一致,只需在方法外加上註解便可,

相關文章
相關標籤/搜索