1. 程式人生 > >Spring事務管理與資料庫隔離級別的關係(Spring+mysql)

Spring事務管理與資料庫隔離級別的關係(Spring+mysql)

√: 可能出現    ×: 不會出現

髒讀 不可重複讀 幻讀
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×

注意:我們討論隔離級別的場景,主要是在多個事務併發的情況下,因此,接下來的講解都圍繞事務併發。

Read uncommitted 讀未提交

公司發工資了,領導把5000元打到singo的賬號上,但是該事務並未提交,而singo正好去檢視賬戶,發現工資已經到賬,是5000元整,非常高興。可是不幸的是,領導發現發給singo的工資金額不對,是2000元,於是迅速回滾了事務,修改金額後,將事務提交,最後singo實際的工資只有2000元,singo空歡喜一場。


出現上述情況,即我們所說的髒讀,兩個併發的事務,“事務A:領導給singo發工資”、“事務B:singo查詢工資賬戶”,事務B讀取了事務A尚未提交的資料。

當隔離級別設定為Read uncommitted時,就可能出現髒讀,如何避免髒讀,請看下一個隔離級別。

Read committed 讀提交

singo拿著工資卡去消費,系統讀取到卡里確實有2000元,而此時她的老婆也正好在網上轉賬,把singo工資卡的2000元轉到另一賬戶,並在singo之前提交了事務,當singo扣款時,系統檢查到singo的工資卡已經沒有錢,扣款失敗,singo十分納悶,明明卡里有錢,為何......

出現上述情況,即我們所說的不可重複讀,兩個併發的事務,“事務A:singo消費”、“事務B:singo的老婆網上轉賬”,事務A事先讀取了資料,事務B緊接了更新了資料,並提交了事務,而事務A再次讀取該資料時,資料已經發生了改變。

當隔離級別設定為Read committed時,避免了髒讀,但是可能會造成不可重複讀。

大多數資料庫的預設級別就是Read committed,比如Sql Server , Oracle。如何解決不可重複讀這一問題,請看下一個隔離級別。

Repeatable read 重複讀

當隔離級別設定為Repeatable read時,可以避免不可重複讀。當singo拿著工資卡去消費時,一旦系統開始讀取工資卡資訊(即事務開始),singo的老婆就不可能對該記錄進行修改,也就是singo的老婆不能在此時轉賬。

雖然Repeatable read避免了不可重複讀,但還有可能出現幻讀。

singo的老婆工作在銀行部門,她時常通過銀行內部系統檢視singo的信用卡消費記錄。有一天,她正在查詢到singo當月信用卡的總消費金額(select sum(amount) from transaction where month = 本月)為80元,而singo此時正好在外面胡吃海塞後在收銀臺買單,消費1000元,即新增了一條1000元的消費記錄(insert transaction ... ),並提交了事務,隨後singo的老婆將singo當月信用卡消費的明細列印到A4紙上,卻發現消費總額為1080元,singo的老婆很詫異,以為出現了幻覺,幻讀就這樣產生了。

注:MySQL的預設隔離級別就是Repeatable read。

Serializable 序列化

Serializable是最高的事務隔離級別,同時代價也花費最高,效能很低,一般很少使用,在該級別下,事務順序執行,不僅可以避免髒讀、不可重複讀,還避免了幻像讀。

首先我來描述一下,資料庫(mysql)層面上對於事務傳播行為和隔離級別的配置和實驗方法:

資料庫層面(採用命令列):其實mySql命令列很簡單,希望實驗操作一下:

//連線資料庫,我這裡是本地,後面是使用者名稱密碼,不要打分號,如果指令不行,配置下環境變數,網上有很多。

1. cmd中執行:mysql -hlocalhost -uroot -pmysql   

//檢視本地資料庫事務傳播行為是手動提交(0),還是自動提交(1)。

2.select @@autocommit;

//如果是0,希望設定為手動提交,這裡其實是設定本對話的autocommit,因為如果你再開一個cmd,發現還是沒改回來,如果想修改全域性的,網上有global方法。

3.set @@autocommit=0;

//然後查詢本地資料庫中的一條記錄,我本地資料庫為test1;

4.use test1;

5.select * from task where taskid=1;

//同時新開一個視窗cmd,連線資料庫,並且修改這條記錄,update語句我就不寫了,或者直接修改資料庫本條記錄。

//再次執行select * from task where taskid=1;發現值沒變。OK因為此時資料庫隔離級別為repeatable read 重複讀,因為mysql預設的隔離級別是重複讀。

//修改資料庫隔離級別

6.set global transaction isolation level read committed;

//檢視一下,可能需要重新連線一下

7.select @@tx_isolation;

//這時在執行一下4,5操作,發現值變了,ok。因為已經改變了資料庫隔離級別,發生了重複讀出不同資料的現象。

(以上操作希望有不明白的上網自學一下,很有用,先把資料庫隔離級別弄明白了)

然後再來講一下,Spring對事務傳播行為和隔離級別的二次封裝。

因為不同專案可能在一個mysql的不同資料庫上,所以可以在專案中配置資料庫的傳播行為和隔離級別:

關於spring的傳播行為(PROPAGATION_REQUIRED、PROPAGATION_REQUIRED等),我《資料庫隔離級別(mysql+Spring)與效能分析 》文章中有講,網上也有很多相關資料,我就不說了。

關於spring的事務隔離級別與資料庫的一樣,也是那四個,多了一個default,我也不仔細講了。

下面主要講一下spring的配置方法:

<property name="transactionAttributes"> 
<props> 
<prop key="save*">PROPAGATION_REQUIRED</prop> 
<prop key="update*">PROPAGATION_REQUIRED</prop> 
<prop key="delete*">PROPAGATION_REQUIRED</prop> 
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> 
<prop key="find*">PROPAGATION_REQUIRED,ISOLATION_READ_UNCOMMITTED</prop>
</props>

就以find為例,可以配置這麼配置,前面是控制傳播行為,後面是控制事務隔離級別的。那麼這時哪怕資料庫層面上是重複讀,但是還是以這裡為準,你會發現在同一個事務中兩次查詢的結果是不一樣的。

最後掃除一個盲區,readonly這個屬性,是放在傳播行為中的,一般書都這麼歸類,我也嘗試了一下,readonly並不能影響資料庫隔離級別,只是配置之後,不允許在事務中對資料庫進行修改操作,僅此而已。

相關推薦

Spring事務管理資料庫隔離級別關係Spring+mysql

√: 可能出現    ×: 不會出現 髒讀 不可重複讀 幻讀 Read uncommitted √ √ √ Read committed × √ √ Repeatable read × × √ Serializable × × × 注意:我們討論隔離級別的場景,主要

【面試】足夠“忽悠”面試官的『Spring事務管理器』原始碼閱讀梳理建議珍藏

PS:文章內容涉及原始碼,請耐心閱讀。     理論實踐,相輔相成 偉大領袖毛主席告訴我們實踐出真知。這是無比正確的。但是也會很辛苦。就像淘金一樣,從大量沙子中淘出金子一定是一個無比艱辛的過程。但如果真能淘出來,也一定是像金子一樣寶貴的東西。他老人家還說過,當真知上升為理論的時候

資料庫事務的四大特性以及事務隔離級別--Spring事務傳播機制&隔離級別 資料庫事務的四大特性以及事務隔離級別

資料庫事務的四大特性以及事務的隔離級別     本篇講訴資料庫中事務的四大特性(ACID),並且將會詳細地說明事務的隔離級別。   如果一個數據庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性: ⑴ 原子性(Atomicity)

數據庫事務的四大特性以及事務隔離級別--Spring事務傳播機制&隔離級別

獨立 mys class nag epo 順序執行 catch 再次 重復   本篇講訴數據庫中事務的四大特性(ACID),並且將會詳細地說明事務的隔離級別。   如果一個數據庫聲稱支持事務的操作,那麽該數據庫必須要具備以下四個特性: ⑴ 原子性(Atomici

Spring事務管理 SpringAOP

nsf 新建 spring事務 釋放資源 pre pan 基本配置 特定 details 1,Spring事務的核心接口   Spring事務管理的實現有許多細節,如果對整個接口框架有個大體了解會非常有利於我們理解事務,下面通過講解Spring的事務接口來了解Spring實

spring事務傳播屬性,隔離級別

package org.springframework.transaction; import java.sql.Connection; /** * Interface that defines Spring-compliant transaction properties. * Based

Spring事務的5種隔離級別(實際上只有4種)

1.在併發的環境中,可能出現下面三種情況        (1) Dirty Reads 髒讀        (2)Non-Repeatable Reads 不可重複讀    

Java知識點集合05--- Spring的兩大核心&Spring事務的傳播特性&隔離級別&ORM&ibatis和Hibernate&Hibernate對映物件狀態

Spring的兩大核心 spring是J2EE應用程式框架,是輕量級的IOC和AOP容器框架(相對於EJB ),針對javabean生命週期進行管理的親兩級容器。 IOC(控制反轉Invesion of control)或DI(依賴注入 Dependency

淺析Spring事務傳播行為和隔離級別

這個就比較繞口了。 比如我們設計ServiceA.methodA的事務級別為PROPAGATION_REQUIRED,ServiceB.methodB的事務級別為PROPAGATION_REQUIRES_NEW,那麼當執行到ServiceB.methodB的時候,ServiceA.methodA所在的事務就會

Spring事務傳播屬性和隔離級別

事務的傳播屬性(Propagation) @Transactional(propagation=Propagation.REQUIRED):這個是預設的屬性。如果存在一個事務,則支援當前事務。如果沒有事務則開啟一個新的事務。被設定成這個級別時,會為每一個被呼

百度面試資料庫隔離級別、overload、override

1.  資料庫的隔離級別         ACID,是指在可靠資料庫管理系統(DBMS)中,事務(transaction)所應該具有的四個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、永續性(Durability).  

spring 事務管理——回滾之service層事務控制層程式碼互調

spring事務管理相關的文章已經有很多了,本人寫此文章主要為自己的實驗做一個記錄,年紀大了,記性不好 首先先貼幾個地址,有興趣研讀的同學可以參考一下: 初級使用: 初級容易犯的錯:事務中catch異常 官方介紹: 預設回滾配置實驗: 以上幾個地址是從不同的角度來

類之間的關係簡略版

類與類之間的關係(簡略版) 1、繼承:略 2、實現:略 3、依賴:人要過河,此時人和船叫做依賴關係,具有偶然性,臨時性; 4、關聯:我和我的朋友叫做關聯關係,不是偶然的,臨時的,是長期的,故也稱為強依賴 5、聚合:班級和學生的關係叫做聚合,班級沒有學生也可以是班級,類之間的關係沒有那麼強

Spring原始碼解讀設計詳析 2018 最全

預設情況: 通常情況下子級div在浮動的情況下,會對父級的div後面的元素佈局產生影響,因為div在浮動的情況下,會脫離正常的文件流導致父級的盒子不能被撐起。這樣父級的高度就可能是0,會影響整個佈局。程式碼和效果如下: 程式碼: <style>     

Problem D: Person類Student類的關係C++期末

當然,一個student首先是一個person。所以,Student類是Person類的派生類。請定義Person類,包括: 1. 資料成員string name和int age,分別表示姓名和年齡。 2. 建構函式和解構函式,它們有相應的輸出,見樣例。 3. void show()函式:按照樣例輸出該物件

spring管理事務屬性之事務4種隔離級別 理解事務的4種隔離級別

理解事務的4種隔離級別 資料庫事務的隔離級別有4種,由低到高分別為Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事務的併發操作中可能會出現髒讀,不可重複讀,幻讀。下面通過事例一一闡述

spring事務管理 隔離級別、傳播行為

1.事務的定義 事務是指多個操作單元組成的合集,多個單元操作是整體不可分割的,要麼都操作不成功,要麼都成功。其必須遵循四個原則(ACID)。 原子性(Atomicity):即事務是不可分割的最小工作單元,事務內的操作要麼全做,要麼全不做; 一致性(Consistency

資料庫事務隔離級別,ACID,spring事務傳播性

ACID,是指在資料庫管理系統(DBMS)中事務所具有的四個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、永續性(Durability)。 在資料庫系統中,一個事務是指由一系列資料庫操作組成的一個完整的邏輯過程。例如銀行轉帳,從原賬戶扣除金額

Spring 事務傳播隔離級別描述

一. 傳播 : 描述在當前情況條件下,後續的事或物是以何種狀態或行為去呈現。       思考情

數據庫事務中的隔離級別和鎖+spring Transactional註解

遇到 丟失更新 讀鎖 討論 acid 通過 行修改 nal dbms 數據庫事務中的隔離級別和鎖 數據庫事務在後端開發中占非常重要的地位,如何確保數據讀取的正確性、安全性也是我們需要研究的問題。 ACID 首先總結一下數據庫事務正確執行的四個要素(ACID): 原子性(At