談一談 對 事務 的理解


1.事務與四大特性

  面試老是談到事務,事務的實現其實很簡單,但是對事務的描述,不同的人有不同的看法,描述 語言更是千變萬化,

這種概念性的東西,經驗告訴我,不能死記硬背,應該用自己的話來理解才是上上簽。

  那么,什么是事務?

  想要理解什么是事務,應該先從事務的4大特性入手。

  分別是:原子性、一致性、隔離性、持久性。英文縮寫是 ACID

  什么是原子性?

  原子性就是要么全部執行成功,要么全部都不執行。
  如何理解?就像前面有個水坑,要么一腳向前跨過去,要么就索性不過去。

  什么是一致性?

 

  事務執行的結果,必須是數據庫從一個一致性狀態變到另一個一致性狀態。
  如何理解?我銀行賬戶有200塊錢,小明銀行賬戶為零,現在是一致性狀態,如果我把200塊錢一次性
轉到小明賬戶后,我的賬戶為 -200,小明的賬戶為 +200 ,最終我的賬戶為0,小明的賬戶為200,
總額不變 ,也就是變到了另一個一致性,不會出現我的賬戶-200后小明的賬戶沒有+200的情況,否則就不是一致性了。

 

  什么是隔離性?

 

  並發操作同一個表時,數據庫會開啟多個事務,事務之間相互隔離,互不影響。
  怎么理解?假設有兩個事務,分別是事務1和事務2 ,那么兩個事務不能相互影響 ,也就是說,要么事務1在開始之前,事務2已經結束了,
要么事務1在結束之前事務2還沒開始,就像加鎖操作,只有事務獲得鎖權限才能對表進行操作,否則需要等待。
不然造成臟讀、幻讀、不可重復讀。【待會解釋這3個區別】

 

  什么是持久性?

  當事務確認完成后,對數據的改變是永久性的。
  怎么理解?對表做曾刪改操作,並提交事務后,曾刪改操作的結果將存在表中,只要不被其他事務做曾刪改操作,那么改變后的表數據將用於保持不變。

 

   又回到老話題,什么是事務?

  根據事務的四大特性可知,事務就是一組嚴密的邏輯操作,所有操作必須全部執行成功,否則將會撤銷所有操作,也就是事務回滾操作。

  怎么理解?

 

 在一個事務中,執行一組sql操作,如果所有操作都沒拋出異常,則commit提交事務,如果拋出了異常,這會執行rollback回滾操作,
也就是新增的數據刪除 ,修改的數據則修改回去,刪除的則新增回來。

 2.事務的並發問題

  什么是臟讀?

事務1讀取了事務2更新后但還沒提交的數據,事務2做回滾操作,那么事務1讀取的數據就是臟數據,這樣的操作就是臟讀。
簡單來說,臟讀就是讀取了另一個事務的未提交數據。

 

  什么是不可重復讀

事務1多次讀取同一個數據,在事務1讀取數據的過程中,事務2對該數據進行了更新並提交事務,
導致事務1多次讀取同一數據的結果不一致,這就是不可重復讀。
簡單來說,不可重復讀就是多次讀取同一數據的結果不一致,該數據被另一個事務更新並提交了

 

  什么是幻讀?

事務1 兩次查詢數據,第二次查詢的結果要么比第一次的結果少了數據、要么比第一次的結果多了數據,因為在兩次查詢之間,被事務2添加或刪除了數據,像出現幻覺一樣。
簡單來說,幻讀就是多次查詢結果不一致,后查詢的結果比之前查詢的結果增加或減少了數據。

 

3.事務隔離級別

【隔離級別從低到高】

(1)讀未提交

讀未提交,顧名思義,就是一個事務可以讀另一個事務未提交的數據,安全性最低的隔離級別,不可避免臟讀數據、不可重復讀、幻讀。

(2)讀提交

 

讀提交,顧名思義,就是一個事務要等另一個事務提交后才能讀取數據,為了解決臟讀才設立的隔離級別,但是不可避免不可重復讀、幻讀。

 

(3)可重復度

 

可重復度,就是在開始讀取數據時,不再允許修改操作,為了解決不可重復讀而設立,但是不可避免幻讀。

 

(4)序列化

序列化,最高的事務隔離級別,事務串行化順序執行,可以避免臟讀、不可重復讀、幻讀,
但是效率低下,消耗數據庫性能,一般不使用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM