12月 23, 2009

[DB] Transaction & Isolation Level

相關文件參考:wikipedia

在資料庫系統中,交易(Transaction)是指一連串不可分割的操作程序,如果在這之中的任一步驟失敗,那麼資料狀態就要回復(Rollback)到尚未異動前的狀態才可行,交易順利完成稱之為 Commit。

為了要維持資料庫的一致、正確性,一個 Transaction 要包含四個(ACID)特性:

(1) Atomicity
一個 Transaction 不可被分割,正常執行完成就宣告 Commit 表示交易正常結束;反之則用 Rollback 宣告交易失敗,資料要回復到異動前的狀態。
(2) Consistency
每筆交易所異動到的資料,要滿足資料庫整體資料的一致性。
(3) Isolation
每筆交易間應當是獨立的,當一筆交易尚未處理完時,異動的資料不能被其他交易使用,避免異動的結果造成其他交易的不正確。
(4) Durability
交易所異動的資料,只有當交易 Commit 後,才會將異動部份更新到資料庫內,即使系統發生故障,也不會影響異動後的資料。

針對 Isolation 的部份,可區分為四個層級。在詳述這些層級之前,先列出同時有多個交易存取資料時,會發生的錯誤:
* Dirty Read
亦稱為 READ UNCOMMITTED,一個交易尚未完成,其他筆交易讀取同一筆資料,可能因為前一個交易對資料有所異動,造成後來的交易讀到錯值。
* Nonrepeatable Read
一個交易對同筆資料進行兩次以上的讀取,但是結果卻不相同,因為在讀取的中間,其他交易有異動過資料,所以造成錯誤。
* Phantoms Read
交易使用 WHERE 指定資料的選取範圍(Range),可能因為其他交易對資料的異動,讓原先不在範圍內的資料,也一併被選中。

將 Isolation 分為四個層級:
[ Read Uncommitted ]
此一等級限制最少,允許讀取其他 Transaction 尚未 Commit 的資料,無法確保資料的一致性及完整性。
[ Read Committed ]
不允許讀取正在「異動」的資料;當資料正由一個 Transaction 異動時,就不允許其他人讀取該資料;但對於一個進行中的 Transaction 允許其他 Transaction 可以更改相關資料。
[ Repeatable Read ]
當一筆資料被讀取後,其他的 Transaction 就不允許修改(UPDATE)或刪除(DELETE)該筆資料,這意味著,在此條件下:同樣的 SQL 語法會得到相同的結果。
[ Serialized Read ]
當一筆資料被讀取後,其他的 Transaction 不允許新增(Insert)、修改、刪除資料。這表示 SQL 的查詢結果,不會因為另一筆 Transaction 新增了一筆符合選取範圍的資料,造成兩次查詢結果的不同。


Isolation Level / Lost Dirty Nonrepeatble Phantoms
可能發生的錯誤 Update Ready Read Read
--------------------------------------------------------
Read Uncommitted V V V V
Read Committed V V
Repeatable Read V
Serialized Read

沒有留言:

張貼留言