天天看點

Spring基礎(十四):Spring的事務回顧

Spring基礎(十四):Spring的事務回顧

文章目錄

​​Spring的事務回顧​​

​​一、事務的概念​​

​​二、事務的特性​​

​​1、原子性​​

​​2、一緻性​​

​​3、隔離性​​

​​4、持久性​​

​​三、事務的并發問題​​

​​1、髒讀(Dirty read)​​

​​2、不可重複讀​​

​​3、幻讀​​

​​四、事務的隔離級别​​

​​五、Spring中可以使用如下方式實作事務的控制​​

Spring的事務回顧

一、事務的概念

事務(Transaction)指的是一個操作序列,該操作序列中的多個操作要麼都做,要麼都不做,是一個不可分割的工作機關,是資料庫環境中的邏輯工作機關,由DBMS中的事務管理子系統負責事務的處理。

目前常用的存儲引擎有InnoDB(MySQL5.5以後預設的存儲引擎)和MyISAM(MySQL5.5之前預設的存儲引擎),其中InnoDB支援事務處理機制,而MyISAM不支援。

二、事務的特性

事務處理可以確定除非事務性序列内的所有操作都成功完成,否則不會永久更新面向資料的資源。通過将一組相關操作組合為一個要麼全部成功要麼全部失敗的序列,可以簡化錯誤恢複并使應用程式更加可靠。

但并不是所有的操作序列都可以稱為事務,這是因為一個操作序列要成為事務,必須滿足事務的原子性(Atomicity)、一緻性(Consistency)、隔離性(Isolation)和持久性(Durability)。這四個特性簡稱為ACID特性。

Spring基礎(十四):Spring的事務回顧

1、原子性

原子是自然界最小的顆粒,具有不可再分的特性。事務中的所有操作可以看做一個原子,事務是應用中不可再分的最小的邏輯執行體。

使用事務對資料進行修改的操作序列,要麼全部執行,要麼全不執行。通常,某個事務中的操作都具有共同的目标,并且是互相依賴的。如果資料庫系統隻執行這些操作中的一部分,則可能會破壞事務的總體目标,而原子性消除了系統隻處理部分操作的可能性。

2、一緻性

一緻性是指事務執行的結果必須使資料庫從一個一緻性狀态,變到另一個一緻性狀态。當資料庫中隻包含事務成功送出的結果時,資料庫處于一緻性狀态。一緻性是通過原子性來保證的。

例如:在轉賬時,隻有保證轉出和轉入的金額一緻才能構成事務。也就是說事務發生前和發生後,資料的總額依然比對。

3、隔離性

隔離性是指各個事務的執行互不幹擾,任意一個事務的内部操作對其他并發的事務,都是隔離的。也就是說:并發執行的事務之間既不能看到對方的中間狀态,也不能互相影響。

例如:在轉賬時,隻有當A賬戶中的轉出和B賬戶中轉入操作都執行成功後才能看到A賬戶中的金額減少以及B賬戶中的金額增多。并且其他的事務對于轉賬操作的事務是不能産生任何影響的。

4、持久性

持久性指事務一旦送出,對資料所做的任何改變,都要記錄到永久存儲器中,通常是儲存進實體資料庫,即使資料庫出現故障,送出的資料也應該能夠恢複。但如果是由于外部原因導緻的資料庫故障,如硬碟被損壞,那麼之前送出的資料則有可能會丢失。

三、事務的并發問題

1、髒讀(Dirty read)

當一個事務正在通路資料并且對資料進行了修改,而這種修改還沒有送出到資料庫中,這時另外一個事務也通路了這個資料,然後使用了這個資料。因為這個資料是還沒有送出的資料,那麼另外一個事務讀到的這個資料是“髒資料”,依據“髒資料”所做的操作可能是不正确的。

Spring基礎(十四):Spring的事務回顧

2、不可重複讀

(Unrepeatableread): 指在一個事務内多次讀同一資料。在這個事務還沒有結束時,另一個事務也通路該資料。那麼,在第一個事務中的兩次讀資料之間,由于第二個事務的修改導緻第一個事務兩次讀取的資料可能不太一樣。這就發生了在一個事務内兩次讀到的資料是不一樣的情況,是以稱為不可重複讀。

Spring基礎(十四):Spring的事務回顧

3、幻讀

(Phantom read): 幻讀與不可重複讀類似。它發生在一個事務(T1)讀取了幾行資料,接着另一個并發事務(T2)插入了一些資料時。在随後的查詢中,第一個事務(T1)就會發現多了一些原本不存在的記錄,就好像發生了幻覺一樣,是以稱為幻讀。

Spring基礎(十四):Spring的事務回顧

不可重複度和幻讀差別:

不可重複讀的重點是修改,幻讀的重點在于新增或者删除。

解決不可重複讀的問題隻需鎖住滿足條件的行,解決幻讀需要鎖表

例1(同樣的條件, 你讀取過的資料, 再次讀取出來發現值不一樣了 ):事務1中的A先生讀取自己的工資為 1000的操作還沒完成,事務2中的B先生就修改了A的工資為2000,導 緻A再讀自己的工資時工資變為 2000;這就是不可重複讀。

例2(同樣的條件, 第1次和第2次讀出來的記錄數不一樣 ):假某工資單表中工資大于3000的有4人,事務1讀取了所有工資大于3000的人,共查到4條記錄,這時事務2又插入了一條工資大于3000的記錄,事務1再次讀取時查到的記錄就變為了5條,這樣就導緻了幻讀

四、事務的隔離級别

事務的隔離級别用于決定如何控制并發使用者讀寫資料的操作。資料庫是允許多使用者并發通路的,如果多個使用者同時開啟事務并對同一資料進行讀寫操作的話,有可能會出現髒讀、不可重複讀和幻讀問題,是以MySQL中提供了四種隔離級别來解決上述問題。

事務的隔離級别從低到高依次為READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ以及SERIALIZABLE,隔離級别越低,越能支援高并發的資料庫操作。

五、Spring中可以使用如下方式實作事務的控制

  • 注解(簡單,必會)
  • XML配置(繁瑣,了解)
  • 📢歡迎點贊 👍 收藏 ⭐留言 📝 如有錯誤敬請指正!
  • 📢本文由 Lansonli 原創
  • 📢停下休息的時候不要忘了别人還在奔跑,希望大家抓緊時間學習,全力奔赴更美好的生活✨