iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 18
0
Modern Web

前端工程師一起來種一棵後端技能樹吧!系列 第 18

[Day 18] Transaction 併發錯誤與隔離層級 - (1)

(以下圖片來自讀書會夥伴講義)

前兩篇文章介紹了資料庫 Transaction 與 ACID 的特性,可以避免一些資料不一致的問題,然而就算有 Atomicity 的特性,在併發的 transaction 狀況下,還是有可能發生不預期的錯誤,今天透過兩篇文章就要來簡單介紹單機狀況下併發 transaction 有可能會發生的錯誤,與對應的解決辦法。

髒讀 Dirty Read

一個事務在處理過程中讀取了另外一個事務未提交的數據。

上面的例子中 Transaction B 雖然將 money 改為 1000 了,但卻還沒有將結果 commit,如果在這短暫的時間中 Transaction A 也對 money 進行讀取,會得到的值是 1000,但如果 Transaction B 後來做了 rollback,money 的值會變回原本的值,然而 Transaction A 還會誤以為值就是 1000,讀取到錯誤的結果,你說髒不髒呢?

不可重複讀 Non-repeatable read

一個 Transaction範圍內,多次查詢某個數據,卻得到不同的結果。

它與髒讀的區別是髒讀是讀到未提交的數據,而不可重複讀讀到的卻是已經提交的數據,但實際上是違反了事務的一致性原則。

看上圖範例應該蠻直覺的,Transaction A 在同一個事務範圍中讀取同一個欄位卻得到不同的結果,違反了一致性原則。

幻讀 Phantom Read

在 Repeatable Read 隔離級別下(之後會介紹),一個事務可能會遇到幻讀(Phantom Read)的問題。

Transaction A 讀取與搜索條件相匹配的若干行。Transaction B 以插入或刪除行等方式來修改 Transaction A 的結果集合,然後再提交。

今天介紹了併發狀況下的 transaction 可能會發生的不同種問題,明天將介紹這些問題的解法 - 隔離層級。


上一篇
[Day 17] Database Transaction & ACID - (2)
下一篇
[Day 19] Transaction 併發錯誤與隔離層級 - (2)
系列文
前端工程師一起來種一棵後端技能樹吧!30

尚未有邦友留言

立即登入留言