數據庫事務(Transaction)的ACID特性解釋

事務(Transaction)是併發控制的基本單位。所謂事務,它是一個操做序列,這些操做要麼都執行,要麼都不執行,它是一個不可分割的工做單位。例如,銀行轉賬工做:從一個賬號扣款並使另外一個賬號增款,這兩個操做要麼都執行,要麼都不執行。mysql

一、數據庫事務必須具有ACID特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔離性)和Durability(持久性)的英文縮寫。sql

1)原子性(Atomicity)數據庫

一個事務(transaction)中的全部操做,要麼所有完成,要麼所有不完成,不會結束在中間某個環節。事務在執行過程當中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。併發

2)一致性(Consistency)ide

事務的一致性指的是在一個事務執行以前和執行以後數據庫都必須處於一致性狀態。若是事務成功地完成,那麼系統中全部變化將正確地應用,系統處於有效狀態。若是在事務中出現錯誤,那麼系統中的全部變化將自動地回滾,系統返回到原始狀態。spa

3)隔離性(Isolation)日誌

指的是在併發環境中,當不一樣的事務同時操縱相同的數據時,每一個事務都有各自的完整數據空間。由併發事務所作的修改必須與任何其餘併發事務所作的修改隔離。事務查看數據更新時,數據所處的狀態要麼是另外一事務修改它以前的狀態,要麼是另外一事務修改它以後的狀態,事務不會查看到中間狀態的數據code

4)持久性(Durability)事務

指的是隻要事務成功結束,它對數據庫所作的更新就必須永久保存下來。即便發生系統崩潰,從新啓動數據庫系統後,數據庫還能恢復到事務成功結束時的狀態。ci

二、事務的(ACID)特性是由關係數據庫管理系統(RDBMS,數據庫系統)來實現的。數據庫管理系統採用日誌來保證事務的原子性、一致性和持久性。日誌記錄了事務對數據庫所作的更新,若是某個事務在執行過程當中發生錯誤,就能夠根據日誌,撤銷事務對數據庫已作的更新,使數據庫退回到執行事務前的初始狀態。

數據庫管理系統採用鎖機制來實現事務的隔離性。當多個事務同時更新數據庫中相同的數據時,只容許持有鎖的事務能更新該數據,其餘事務必須等待,直到前一個事務釋放了鎖,其餘事務纔有機會更新該數據。

三、在關係型數據庫中,事務的隔離性分爲四個隔離級別,在解讀這四個級別前先介紹幾個關於讀數據的概念。

1)髒讀(Dirty Reads):所謂髒讀就是對髒數據(Drity Data)的讀取,而髒數據所指的就是未提交的數據。也就是說,一個事務正在對一條記錄作修改,在這個事務完成並提交以前,這條數據是處於待定狀態的(可能提交也可能回滾),這時,第二個事務來讀取這條沒有提交的數據,並據此作進一步的處理,就會產生未提交的數據依賴關係。這種現象被稱爲髒讀。

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

3)幻讀(Phantom Reads):一個事務按相同的查詢條件從新讀取之前檢索過的數據,卻發現其餘事務插入了知足其查詢條件的新數據,這種現象就稱爲幻讀。

 

四、事務四個隔離級別對比:

1)未提交讀(Read Uncommitted):SELECT語句以非鎖定方式被執行,因此有可能讀到髒數據,隔離級別最低。

2)提交讀(Read Committed):只能讀取到已經提交的數據。即解決了髒讀,但未解決不可重複讀。

3)可重複讀(Repeated Read):在同一個事務內的查詢都是事務開始時刻一致的,InnoDB的默認級別。在SQL標準中,該隔離級別消除了不可重複讀,可是還存在幻讀。

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

隔離級別對比表:

 

5、事務隔離級別的設置:

1)服務啓動選項--transaction-isolation或在配置文件中設置:

[mysqld]
transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED
                         | REPEATABLE-READ | SERIALIZABLE}

2)服務啓動後的設置:

SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL

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

相關文章
相關標籤/搜索