1. 程式人生 > >資料庫系列之 事務隔離的可重複讀

資料庫系列之 事務隔離的可重複讀

簡介:事務是一條或多條資料庫操作的集合,在事務中的操作,要麼都執行修改,要麼都不執行。

事務的四大性質即ACID

A(atomicity)原子性:一個事務的執行被視為一個不可分割的最小單元。事務裡面的操作,要麼全部成功執行,要麼全部失敗回滾,不可以只執行其中的一部分。

C(consistency)一致性:一個事務的執行不應該破壞資料庫的完整性約束。

I(isolation)隔離性:事務之間相互獨立,互不幹撓。

D(durability)永續性:事務提交之後,需要將提交的事務持久化到磁碟。即使系統崩潰,提交的資料也不應該丟失。

 事物的隔離級別

事物的隔離級別主要分為四種,即

Read uncommitted(讀未提交):事務中的修改,即使沒有提交,在其他事務也都是可見的。結果:產生髒讀

Read committed(讀已提交):一個事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。這個級別有時候也叫做不可重複讀,因為在一個事物中執行多次相同的查詢,可能會得到不一樣的結果。因為在這多次讀之間可能有其他事務更改這個資料,每次讀到的資料都是已經提交的。結果:產生不可重複讀

Repeatable read(可重複讀):解決了髒讀,也保證了在同一個事務中多次讀取同樣記錄的結果是一致的。但是理論上,可重複讀隔離級別還是無法解決另外一個幻讀

的問題,指的是當某個事務在讀取某個範圍內的記錄時,另外一個事務也在該範圍內插入了新的記錄,當之前的事務再次讀取該範圍內的記錄時,產生幻行。結果:產生幻讀

Serializable(可序列化):它通過強制事務序列執行,避免了前面說的幻讀的問題,但由於讀取的每行資料都加鎖,會導致大量的鎖徵用問題,因此效能也最差。

隔離級別 產生髒讀 產生不可重複讀 產生幻讀
讀未提交
讀已提交 ×
可重複讀
× ×
序列化 × × ×

下面首先談一談 可重複讀

 從兩個方面探究

1. 如何避免了不可重複讀:

首先,不可重複讀是因為在一個事物中執行多次相同的查詢,可能會得到不一樣的結果。因為在這多次讀之間可能有其他事務更改這個資料,每次讀到的資料都是已經提交的。

那麼可重複讀是如何避免了這個問題呢?原來是因為事物在執行查詢時,對檢索的資料(範圍性)都加了行鎖(LOCK),這樣其他事物就無法對這些加了鎖的資料進行更改,自然避免了同一事物多次查詢資料不一致的問題。

2. 為什麼會產生幻讀:

指的是當某個事務在讀取某個範圍內的記錄時,另外一個事務也在該範圍內插入了新的記錄,當之前的事務再次讀取該範圍內的記錄時,會產生幻行。

上面談到如何避免不可重複讀,是因為對檢索到的資料加了鎖,但是並沒有阻止別的事物在這些資料行中間插入新的資料行,導致同一事物多次查詢時,突然發現多出來一行或幾行資料(幻行)。這就是所謂的幻讀。


當下,熱門的幾大資料庫如

SQL Server、Oracle 都採用的是第二隔離級別:讀已提交。

MySQL 採用的是 可重複讀。


轉載請註明來源。