1. 程式人生 > >有關Spring事務,看這一篇就足夠了

有關Spring事務,看這一篇就足夠了

本文將按照宣告式事務的五個特性進行介紹:

  1. 事務傳播機制
  2. 事務隔離機制
  3. 只讀
  4. 事務超時
  5. 回滾規則

Spring事務傳播機制

事務的特性

  • 原子性(Atomicity):事務是一個原子操作,由一系列動作組成。事務的原子性確保動作要麼全部完成,要麼完全不起作用。
  • 一致性(Consistency):一旦事務完成(不管成功還是失敗),系統必須確保它所建模的業務處於一致的狀態,而不會是部分完成部分失敗。在現實中的資料不應該被破壞。
  • 隔離性(Isolation):可能有許多事務會同時處理相同的資料,因此每個事務都應該與其他事務隔離開來,防止資料損壞。
  • 永續性(Durability):一旦事務完成,無論發生什麼系統錯誤,它的結果都不應該受到影響,這樣就能從任何系統崩潰中恢復過來。通常情況下,事務的結果被寫到持久化儲存器中。

Spring事務的配置方式

Spring支援程式設計式事務管理以及宣告式事務管理兩種方式。

1. 程式設計式事務管理

程式設計式事務管理是侵入性事務管理,使用TransactionTemplate或者直接使用PlatformTransactionManager,對於程式設計式事務管理,Spring推薦使用TransactionTemplate。

2. 宣告式事務管理

宣告式事務管理建立在AOP之上,其本質是對方法前後進行攔截,然後在目標方法開始之前建立或者加入一個事務,執行完目標方法之後根據執行的情況提交或者回滾。
程式設計式事務每次實現都要單獨實現,但業務量大功能複雜時,使用程式設計式事務無疑是痛苦的,而宣告式事務不同,宣告式事務屬於無侵入式,不會影響業務邏輯的實現,只需要在配置檔案中做相關的事務規則宣告或者通過註解的方式,便可以將事務規則應用到業務邏輯中。
顯然宣告式事務管理要優於程式設計式事務管理,這正是Spring倡導的非侵入式的程式設計方式。唯一不足的地方就是宣告式事務管理的粒度是方法級別,而程式設計式事務管理是可以到程式碼塊的,但是可以通過提取方法的方式完成宣告式事務管理的配置。

事務的傳播機制

事務的傳播性一般用在事務巢狀的場景,比如一個事務方法裡面呼叫了另外一個事務方法,那麼兩個方法是各自作為獨立的方法提交還是內層的事務合併到外層的事務一起提交,這就是需要事務傳播機制的配置來確定怎麼樣執行。
常用的事務傳播機制如下:

  • PROPAGATION_REQUIRED
    Spring預設的傳播機制,能滿足絕大部分業務需求,如果外層有事務,則當前事務加入到外層事務,一塊提交,一塊回滾。如果外層沒有事務,新建一個事務執行
  • PROPAGATION_REQUES_NEW
    該事務傳播機制是每次都會新開啟一個事務,同時把外層事務掛起,噹噹前事務執行完畢,恢復上層事務的執行。如果外層沒有事務,執行當前新開啟的事務即可
  • PROPAGATION_SUPPORT
    如果外層有事務,則加入外層事務,如果外層沒有事務,則直接使用非事務方式執行。完全依賴外層的事務
  • PROPAGATION_NOT_SUPPORT
    該傳播機制不支援事務,如果外層存在事務則掛起,執行完當前程式碼,則恢復外層事務,無論是否異常都不會回滾當前的程式碼
  • PROPAGATION_NEVER
    該傳播機制不支援外層事務,即如果外層有事務就丟擲異常
  • PROPAGATION_MANDATORY
    與NEVER相反,如果外層沒有事務,則丟擲異常
  • PROPAGATION_NESTED
    該傳播機制的特點是可以儲存狀態儲存點,當前事務回滾到某一個點,從而避免所有的巢狀事務都回滾,即各自回滾各自的,如果子事務沒有把異常吃掉,基本還是會引起全部回滾的。

傳播規則回答了這樣一個問題:一個新的事務應該被啟動還是被掛起,或者是一個方法是否應該在事務性上下文中執行。

事務的隔離級別

事務的隔離級別定義一個事務可能受其他併發務活動活動影響的程度,可以把事務的隔離級別想象為這個事務對於事物處理資料的自私程度。

在一個典型的應用程式中,多個事務同時執行,經常會為了完成他們的工作而操作同一個資料。併發雖然是必需的,但是會導致以下問題:

  1. 髒讀(Dirty read)
    髒讀發生在一個事務讀取了被另一個事務改寫但尚未提交的資料時。如果這些改變在稍後被回滾了,那麼第一個事務讀取的資料就會是無效的。
  2. 不可重複讀(Nonrepeatable read)
    不可重複讀發生在一個事務執行相同的查詢兩次或兩次以上,但每次查詢結果都不相同時。這通常是由於另一個併發事務在兩次查詢之間更新了資料。

    不可重複讀重點在修改。

  3. 幻讀(Phantom reads)
    幻讀和不可重複讀相似。當一個事務(T1)讀取幾行記錄後,另一個併發事務(T2)插入了一些記錄時,幻讀就發生了。在後來的查詢中,第一個事務(T1)就會發現一些原來沒有的額外記錄。

    幻讀重點在新增或刪除。

在理想狀態下,事務之間將完全隔離,從而可以防止這些問題發生。然而,完全隔離會影響效能,因為隔離經常涉及到鎖定在資料庫中的記錄(甚至有時是鎖表)。完全隔離要求事務相互等待來完成工作,會阻礙併發。因此,可以根據業務場景選擇不同的隔離級別。

隔離級別 含義
ISOLATION_DEFAULT 使用後端資料庫預設的隔離級別
ISOLATION_READ_UNCOMMITTED 允許讀取尚未提交的更改。可能導致髒讀、幻讀或不可重複讀。
ISOLATION_READ_COMMITTED (Oracle 預設級別)允許從已經提交的併發事務讀取。可防止髒讀,但幻讀和不可重複讀仍可能會發生。
ISOLATION_REPEATABLE_READ (MYSQL預設級別)對相同欄位的多次讀取的結果是一致的,除非資料被當前事務本身改變。可防止髒讀和不可重複讀,但幻讀仍可能發生。
ISOLATION_SERIALIZABLE 完全服從ACID的隔離級別,確保不發生髒讀、不可重複讀和幻影讀。這在所有隔離級別中也是最慢的,因為它通常是通過完全鎖定當前事務所涉及的資料表來完成的。

只讀

如果一個事務只對資料庫執行讀操作,那麼該資料庫就可能利用那個事務的只讀特性,採取某些優化措施。通過把一個事務宣告為只讀,可以給後端資料庫一個機會來應用那些它認為合適的優化措施。由於只讀的優化措施是在一個事務啟動時由後端資料庫實施的, 因此,只有對於那些具有可能啟動一個新事務的傳播行為(PROPAGATION_REQUIRES_NEW、PROPAGATION_REQUIRED、 ROPAGATION_NESTED)的方法來說,將事務宣告為只讀才有意義。

事務超時

為了使一個應用程式很好地執行,它的事務不能執行太長時間。因此,宣告式事務的下一個特性就是它的超時。

假設事務的執行時間變得格外的長,由於事務可能涉及對資料庫的鎖定,所以長時間執行的事務會不必要地佔用資料庫資源。這時就可以宣告一個事務在特定秒數後自動回滾,不必等它自己結束。

由於超時時鐘在一個事務啟動的時候開始的,因此,只有對於那些具有可能啟動一個新事務的傳播行為(PROPAGATION_REQUIRES_NEW、PROPAGATION_REQUIRED、ROPAGATION_NESTED)的方法來說,宣告事務超時才有意義。

回滾規則

在預設設定下,事務只在出現執行時異常(runtime exception)時回滾,而在出現受檢查異常(checked exception)時不回滾(這一行為和EJB中的回滾行為是一致的)。
不過,可以宣告在出現特定受檢查異常時像執行時異常一樣回滾。同樣,也可以宣告一個事務在出現特定的異常時不回滾,即使特定的異常是執行時異常。

Spring宣告式事務配置參考

事物配置中有哪些屬性可以配置?以下只是簡單的使用參考

  1. 事務的傳播性:
    @Transactional(propagation=Propagation.REQUIRED)
  2. 事務的隔離級別:
    @Transactional(isolation = Isolation.READ_UNCOMMITTED)

讀取未提交資料(會出現髒讀, 不可重複讀) 基本不使用

  1. 只讀:
    @Transactional(readOnly=true)
    該屬性用於設定當前事務是否為只讀事務,設定為true表示只讀,false則表示可讀寫,預設值為false。
  2. 事務的超時性:
    @Transactional(timeout=30)
  3. 回滾:
    指定單一異常類:@Transactional(rollbackFor=RuntimeException.class)
    指定多個異常類:@Transactional(rollbackFor={RuntimeException.class, Exception.class})

該屬性用於設定需要進行回滾的異常類陣列,當方法中丟擲指定異常陣列中的異常時,則進行事務回滾。

最後,限於筆者經驗水平有限,歡迎讀者就文中的觀點提出寶貴的建議和意見。如果想獲得更多的學習資源或者想和更多的技術愛好者一起交流,可以關注我的公眾號『全菜工程師小輝』後臺回覆關鍵詞領取學習資料、進入前後端技術交流群和程式設計師副業群。同時也可以加入程式設計師副業群Q群:735764906 一起交流。

相關推薦

有關Spring事務足夠

本文將按照宣告式事務的五個特性進行介紹: 事務傳播機制 事務隔離機制 只讀 事務超時 回滾規則 Spring事務傳播機制 事務的特性 原子性(Atomicity):事務是一個原子操作,由一系列動作組成。事務的原子性確保動作要麼全部完成,要麼完全不起作用。 一致性(Consistency):一旦事務完成(

Spring Cloud Config 實現配置中心

Spring Cloud Config 是 Spring Cloud 家族中最早的配置中心,雖然後來又釋出了 Consul 可以代替配置中心功能,但是 Config 依然適用於 Spring Cloud 專案,通過簡單的配置即可實現功能。 配置檔案是我們再熟悉不過的了,尤其是 Spring Boot 專案

有關阿里雲對SaaS行業的思考

過去二十年,隨著改革開放的深化,以及中國的人口紅利等因素,中國誕生了大批To C的高市值網際網路巨頭,2C的領域高速發展,而2

Azure IOT 設備固件更新技巧

trigger 物聯網平臺 搭建 href ice 有效 面板 調用 創建 嫌長不看版 今天為大家準備的硬菜是:在 Azure IoT 中心創建 Node.js 控制臺應用,進行端到端模擬固件更新,為基於 Intel Edison 的設備安裝新版固件的流程。通過創建模擬設備

想做好PPT折線圖

12月 image 菊花 -c 強調 spa any border 線圖 配圖主題無關今天鄭少跟大家聊聊折線圖的使用方法,或者你有疑問,折線圖很簡單,插入修改數據不就好了嗎?如果你要是這樣想的,恭喜你,有可能你會做出下面這樣的效果。如果你要是稍微懂一點折線圖的使用方法,你就

Linux 問題故障定位

1. 背景 有時候會遇到一些疑難雜症,並且監控外掛並不能一眼立馬發現問題的根源。這時候就需要登入伺服器進一步深入分析問題的根源。那麼分析問題需要有一定的技術經驗積累,並且有些問題涉及到的領域非常廣,才能定位到問題。所以,分析問題和踩坑是非常鍛鍊一個人的成長和提升自我能力。如果我們有一套好的分析工具,那將是事

C語言從入門到精通

影響 內容 當前 位置 replace 雙精度 下標 寄存器變量 一個 No.1 計算機與程序設計語言的關系 計算機系統由硬件系統和軟件系統構成,硬件相當於人類的肉體,而軟件相當於人類的靈魂,如果脫離了靈魂,人類就是一具行屍走肉 No.2 C語言的特點 代碼簡潔,靈活性高

【MYSQL學習筆記02】MySQL的高階應用之Explain(完美詳細版

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/wx1528159409 最近學習MySQL的高階應用Explain,寫一篇學習心得與總結,目錄腦圖如下: 一、Explain基本概念 1. Explain定義 · 我們知道M

抖音內容運營全解剖 !

抖音的火爆已經不用多說,作為短視訊的頭部APP,抖音已經從微信手中奪走不少使用者時間,成為新的“時間黑洞”。 比如:“中毒了,我每天晚上要刷2個小時”,“下一站,逃離微信,上抖音”… 一個企業運營抖音的目的是什麼? 答案顯而易見,無非就是做品牌營銷、擴大品牌影響力。 在短視訊領域積累

百萬併發下的Nginx優化

本文作者主要分享在 Nginx 效能方面的實踐經驗,希望能給大家帶來一些系統化思考,幫助大家更有效地去做 Nginx。 優化方法論 我重點分享如下兩個問題: 保持併發連線數,怎麼樣做到記憶體有效使用。 在高併發的同時保持高吞吐量的重要要點。 實現層面主要是三方面優化,主要聚焦

理解Sharding jdbc原理

相比於Spring基於AbstractRoutingDataSource實現的分庫分表功能,Sharding jdbc在單庫單表擴充套件到多庫多表時,相容性方面表現的更好一點。例如,spring實現的分庫分表sql寫法如下: select id, name, price,

產品設計教程:如何理解 px,dp,dpi, pt

先聊聊熟悉的幾個單位 圍繞著各種螢幕做設計和開發的人會碰到下面幾個單位:in, pt, px, dpi,dip/dp, sp 下面先簡單回顧下前四個單位: "in" inches的縮寫,英寸。就是螢幕的物理長度單位。一英寸等於2.54cm。比如Android手機

中後臺產品的表格設計(原型規範下載)

中後臺產品的表格設計,看這一篇就夠了(原型規範下載) 2018年4月16日luodonggan 中後臺產品的表格設計,看這一篇就夠了(原型規範下載) 經過了將近一年的後臺產品經歷,踩了很多坑,試了很多錯,也學習到了很多東西,目前也形成了自己的一套規範。本文將其中的部分收穫彙總成文,

Linux 常用指令 —— 摘自《Linux Probe》

touch:用於建立空白檔案或設定檔案的時間,ps:黑客可以用touch指令來修改檔案的最後修改時間,以隱藏自己的修改行為。 mkdir:用於建立空白的目錄,如mkdir path,可以結合引數-p來遞迴建立檔案目錄,如mkdir -p a/b/c/d/e cp:用於複製檔案或目錄,如cp 1.txt p

樹狀陣列(Binary Indexed Tree)

定義 根據維基百科的定義: A Fenwick tree or binary indexed tree is a data structure that can efficiently update elements and calculate pr

Cookie介紹及在Android中的使用總結超詳細

Cookie介紹 cookie的起源 早期Web開發面臨的最大問題之一是如何管理狀態。簡言之,伺服器端沒有辦法知道兩個請求是否來自於同一個瀏覽器。那時的辦法是在請求的頁面中插入一個token,並且在下一次請求中將這個token返回(至伺服器)。這就需要在form中插入一個包含toke

關於Kaggle入門

這次醞釀了很久想給大家講一些關於Kaggle那點兒事,幫助對資料科學(Data Science)有興趣的同學們更好的瞭解這個專案,最好能親身參與進來,體會一下學校所學的東西和想要解決一個實際的問題所需要的能力的差距。雖然不是Data Science出身,但本著嚴謹的科研態

並查集(Union-Find Algorithm)

動態連線(Dynamic connectivity)的問題 所謂的動態連線問題是指在一組可能相互連線也可能相互沒有連線的物件中,判斷給定的兩個物件是否聯通的一類問題。這類問題可以有如下抽象: 有一組構成不相交集合的物件 union: 聯通兩個物件

Android 必須知道2018年流行的框架庫及開發語言

導語2017 已經悄悄的走了,2018 也已經匆匆的來了,我們在總結過去的同時,也要展望一下未來,來規劃一下今年要學哪些新技術。這幾年優秀Android的開源庫不斷推出,新技術層出不窮,需要我們不斷去了解和掌握,在提高自身開發水平的同時,我們需要付出更多學習精力和時間。俗話說

Android 必須知道2018年流行的框架庫及開發語言

本文更新時間:2018年07月12日15:50:40導語    2017 已經悄悄的走了,2018 也已經匆匆的來了,我們在總結過去的同時,也要展望一下未來,來規劃一下今年要學哪些新技術。這幾年優秀Android的開源庫不斷推出,新技術層出不窮,需要我們不斷去了解和掌握,在提