天天看點

資料庫事務(Transaction)的ACID特性解釋

事務(Transaction)是并發控制的基本機關。所謂事務,它是一個操作序列,這些操作要麼都執行,要麼都不執行,它是一個不可分割的工作機關。例如,銀行轉帳工作:從一個帳号扣款并使另一個帳号增款,這兩個操作要麼都執行,要麼都不執行。

1、資料庫事務必須具備ACID特性,ACID是Atomic(原子性)、Consistency(一緻性)、Isolation(隔離性)和Durability(持久性)的英文縮寫。

1)原子性(Atomicity)

一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被復原(Rollback)到事務開始前的狀态,就像這個事務從來沒有執行過一樣。

2)一緻性(Consistency)

事務的一緻性指的是在一個事務執行之前和執行之後資料庫都必須處于一緻性狀态。如果事務成功地完成,那麼系統中所有變化将正确地應用,系統處于有效狀态。如果在事務中出現錯誤,那麼系統中的所有變化将自動地復原,系統傳回到原始狀态。

3)隔離性(Isolation)

指的是在并發環境中,當不同的事務同時操縱相同的資料時,每個事務都有各自的完整資料空間。由并發事務所做的修改必須與任何其他并發事務所做的修改隔離。事務檢視資料更新時,資料所處的狀态要麼是另一事務修改它之前的狀态,要麼是另一事務修改它之後的狀态,事務不會檢視到中間狀态的資料。

4)持久性(Durability)

指的是隻要事務成功結束,它對資料庫所做的更新就必須永久儲存下來。即使發生系統崩潰,重新啟動資料庫系統後,資料庫還能恢複到事務成功結束時的狀态。

2、事務的(ACID)特性是由關系資料庫管理系統(RDBMS,資料庫系統)來實作的。資料庫管理系統采用日志來保證事務的原子性、一緻性和持久性。日志記錄了事務對資料庫所做的更新,如果某個事務在執行過程中發生錯誤,就可以根據日志,撤銷事務對資料庫已做的更新,使資料庫退回到執行事務前的初始狀态。

資料庫管理系統采用鎖機制來實作事務的隔離性。當多個事務同時更新資料庫中相同的資料時,隻允許持有鎖的事務能更新該資料,其他事務必須等待,直到前一個事務釋放了鎖,其他事務才有機會更新該資料。

3、在關系型資料庫中,事務的隔離性分為四個隔離級别,在解讀這四個級别前先介紹幾個關于讀資料的概念。

1)髒讀(Dirty Reads):所謂髒讀就是對髒資料(Drity Data)的讀取,而髒資料所指的就是未送出的資料。也就是說,一個事務正在對一條記錄做修改,在這個事務完成并送出之前,這條資料是處于待定狀态的(可能送出也可能復原),這時,第二個事務來讀取這條沒有送出的資料,并據此做進一步的處理,就會産生未送出的資料依賴關系。這種現象被稱為髒讀。

2)不可重複讀(Non-Repeatable Reads):一個事務先後讀取同一條記錄,但兩次讀取的資料不同,我們稱之為不可重複讀。也就是說,這個事務在兩次讀取之間該資料被其它事務所修改。

3)幻讀(Phantom Reads):一個事務按相同的查詢條件重新讀取以前檢索過的資料,卻發現其他事務插入了滿足其查詢條件的新資料,這種現象就稱為幻讀。

4、事務四個隔離級别對比:

1)未送出讀(Read Uncommitted):SELECT語句以非鎖定方式被執行,是以有可能讀到髒資料,隔離級别最低。

2)送出讀(Read Committed):隻能讀取到已經送出的資料。即解決了髒讀,但未解決不可重複讀。

3)可重複讀(Repeated Read):在同一個事務内的查詢都是事務開始時刻一緻的,InnoDB的預設級别。在SQL标準中,該隔離級别消除了不可重複讀,但是還存在幻讀。

4)串行讀(Serializable):完全的串行化讀,所有SELECT語句都被隐式的轉換成SELECT ... LOCK IN SHARE MODE,即讀取使用表級共享鎖,讀寫互相都會阻塞。隔離級别最高。

隔離級别對比表:

資料庫事務(Transaction)的ACID特性解釋

5、事務隔離級别的設定:

1)服務啟動選項<code>--transaction-isolation</code><code>或在配置檔案中設定:</code>

2)服務啟動後的設定:

SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL

{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

本文轉自 h2appy  51CTO部落格,原文連結:http://blog.51cto.com/h2appy/771768,如需轉載請自行聯系原作者