mysql事務特性及四種隔離級別

事務的特性:ACID

我剛纔提到了事務的特性:要麼完全執行,要麼都不執行。不過要對事務進行更深一步的理解,還要從事務的 4 個特性說起,這 4 個特性用英文字母來表達就是 ACID。

  • A,也就是原子性(Atomicity)。原子的概念就是不可分割,你可以把它理解爲組成物質的基本單位,也是我們進行數據處理操作的基本單位。
  • C,就是一致性(Consistency)。一致性指的就是數據庫在進行事務操作後,會由原來的一致狀態,變成另一種一致的狀態。也就是說當事務提交後,或者當事務發生回滾後,數據庫的完整性約束不能被破壞。
  • I,就是隔離性(Isolation)。它指的是每個事務都是彼此獨立的,不會受到其他事務的執行影響。也就是說一個事務在提交之前,對其他事務都是不可見的。
  • 最後一個 D,指的是持久性(Durability)。事務提交之後對數據的修改是持久性的,即使在系統出故障的情況下,比如系統崩潰或者存儲介質發生故障,數據的修改依然是有效的。因爲當事務完成,數據庫的日誌就會被更新,這時可以通過日誌,讓系統恢復到最後一次成功的更新狀態。

ACID 可以說是事務的四大特性,在這四個特性中,原子性是基礎,隔離性是手段,一致性是約束條件,而持久性是我們的目的。

事務的常用控制語句

START TRANSACTION 或者 BEGIN,作用是顯式開啓一個事務。
COMMIT:提交事務。當提交事務後,對數據庫的修改是永久性的。
ROLLBACK 或者 ROLLBACK TO [SAVEPOINT],意爲回滾事務。意思是撤銷正在進行的所有沒有提交的修改,或者將事務回滾到某個保存點。
SAVEPOINT:在事務中創建保存點,方便後續針對保存點進行回滾。一個事務中可以存在多個保存點。
RELEASE SAVEPOINT:刪除某個保存點。
SET TRANSACTION,設置事務的隔離級別。

事務併發處理可能存在的異常都有哪些

  1. 髒讀:讀到了其他事務還沒有提交的數據。
  2. 不可重複讀:對某數據進行讀取,發現兩次讀取的結果不同,也就是說沒有讀到相同的內容。這是因爲有其他事務對這個數據同時進行了修改或刪除。
  3. 幻讀:事務 A 根據條件查詢得到了 N 條數據,但此時事務 B 更改或者增加了 M 條符合事務 A 查詢條件的數據,這樣當事務 A 再次進行查詢的時候發現會有 N+M 條數據,產生了幻讀

事務隔離的級別有哪些?

解決異常數量從少到多的順序(比如讀未提交可能存在 3 種異常,可串行化則不會存在這些異常)決定了隔離級別的高低,這四種隔離級別從低到高分別是:讀未提交(READ UNCOMMITTED )、讀已提交(READ COMMITTED)、可重複讀(REPEATABLE READ)和可串行化(SERIALIZABLE)。這些隔離級別能解決的異常情況如下表所示:

你能看到可串行化能避免所有的異常情況,而讀未提交則允許異常情況發生。
關於這四種級別,簡單講解下。

  • 讀未提交,也就是允許讀到未提交的數據,這種情況下查詢是不會使用鎖的,可能會產生髒讀、不可重複讀、幻讀等情況。
  • 讀已提交就是隻能讀到已經提交的內容,可以避免髒讀的產生,屬於 RDBMS 中常見的默認隔離級別(比如說 Oracle 和 SQL Server),但如果想要避免不可重複讀或者幻讀,就需要我們在 SQL 查詢的時候編寫帶加鎖的 SQL 語句(我會在進階篇裏講加鎖)。
  • 可重複讀,保證一個事務在相同查詢條件下兩次查詢得到的數據結果是一致的,可以避免不可重複讀和髒讀,但無法避免幻讀。MySQL 默認的隔離級別就是可重複讀。
  • 可串行化,將事務進行串行化,也就是在一個隊列中按照順序執行,可串行化是最高級別的隔離等級,可以解決事務讀取中所有可能出現的異常情況,但是它犧牲了系統的併發性。

實際操作模擬:

#查看事務隔離級別
SHOW VARIABLES LIKE 'transaction_isolation';
#設置隔離級別爲讀未提交
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
#查看自動提交開關
SHOW VARIABLES LIKE 'autocommit';
#關閉自動提交
set autocommit=0;

(後續補充髒讀、可重複讀、幻讀demo)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章