在項目中遇到的一些關於事務的問題,而後通過查閱資料,再對事務作一些分析和總結。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自動化註解
再進入TransactionManagementConfigurationSelector時候,構造了 AutoProxyRegistrar——至關於一個自定義組件註冊器,在容器中註冊了一個後置處理器; ProxyTransactionManagementConfiguration——是一個容器配置類,在其中註冊了事務加強器。
這兩個組件的實現原理,有點難。抱歉,實在懟不動,以上兩個組件原理本人蔘考 www.cnblogs.com/dubhlinn/p/… 有興趣的盆友能夠親自去看看 看下關於原理的總結,
仍是看下怎麼用吧, 利用config過濾器創建關於數據庫鏈接, 開啓事務,
而後用法同配置xml方式一致,只需在方法外加上註解便可,