(以下圖片來自讀書會夥伴講義)
前兩篇文章介紹了資料庫 Transaction 與 ACID 的特性,可以避免一些資料不一致的問題,然而就算有 Atomicity 的特性,在併發的 transaction 狀況下,還是有可能發生不預期的錯誤,今天透過兩篇文章就要來簡單介紹單機狀況下併發 transaction 有可能會發生的錯誤,與對應的解決辦法。
一個事務在處理過程中讀取了另外一個事務未提交的數據。
上面的例子中 Transaction B 雖然將 money 改為 1000 了,但卻還沒有將結果 commit,如果在這短暫的時間中 Transaction A 也對 money 進行讀取,會得到的值是 1000,但如果 Transaction B 後來做了 rollback,money 的值會變回原本的值,然而 Transaction A 還會誤以為值就是 1000,讀取到錯誤的結果,你說髒不髒呢?
一個 Transaction範圍內,多次查詢某個數據,卻得到不同的結果。
它與髒讀的區別是髒讀是讀到未提交的數據,而不可重複讀讀到的卻是已經提交的數據,但實際上是違反了事務的一致性原則。
看上圖範例應該蠻直覺的,Transaction A 在同一個事務範圍中讀取同一個欄位卻得到不同的結果,違反了一致性原則。
在 Repeatable Read 隔離級別下(之後會介紹),一個事務可能會遇到幻讀(Phantom Read)的問題。
Transaction A 讀取與搜索條件相匹配的若干行。Transaction B 以插入或刪除行等方式來修改 Transaction A 的結果集合,然後再提交。
今天介紹了併發狀況下的 transaction 可能會發生的不同種問題,明天將介紹這些問題的解法 - 隔離層級。