閱讀608 返回首頁    go 技術社區[雲棲]


數據庫相關

ACID
ACID,是指數據庫管理係統(DBMS)在寫入或更新資料的過程中,為保證事務(transaction)是正確可靠的,所必須具備的四個特性:原子性(atomicity,或稱不可分割性)、一致性(consistency)、隔離性(isolation,又稱獨立性)、持久性(durability)。

在數據庫係統中,一個事務是指:由一係列數據庫操作組成的一個完整的邏輯過程。例如銀行轉帳,從原賬戶扣除金額,以及向目標賬戶添加金額,這兩個數據庫操作的總和,構成一個完整的邏輯過程,不可拆分。這個過程被稱為一個事務,具有ACID特性。ACID的概念在ISO/IEC 10026-1:1992文件的第四段內有所說明。

四大特性
原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性:在事務開始之前和事務結束以後,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續數據庫可以自發性地完成預定的工作。
隔離性:數據庫允許多個並發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務並發執行時由於交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。
持久性:事務處理結束後,對數據的修改就是永久的,即便係統故障也不會丟失。(摘自維基百科)

事務隔離級別

未提交讀(Read uncommitted)
已提交讀(Read committed)
可重複讀(Repeatable read)
可串行化(Serializable)

隔離級別 髒讀(Dirty Read) 不可重複讀(NonRepeatable Read) 幻讀(Phantom Read)
未提交讀(Read uncommitted) 可能 可能 可能
已提交讀(Read committed) 不可能 可能 可能
可重複讀(Repeatable read) 不可能 不可能 可能
可串行化(Serializable ) 不可能 不可能 不可能

四個級別逐漸增強,每個級別解決一個問題。事務級別越高,性能越差,大多數環境read committed 可以用。

  • 未提交讀(Read Uncommitted):允許髒讀,也就是可能讀取到其他會話中未提交事務修改的數據。
  • 提交讀(Read Committed):隻能讀取到已經提交的數據。Oracle等多數數據庫默認都是該級別 (不重複讀)。
  • 可重複讀(Repeated Read):可重複讀。在同一個事務內的查詢都是事務開始時刻一致的,InnoDB默認級別。在SQL標準中,該隔離級別消除了不可重複讀,但是還存在幻象讀。
  • 串行讀(Serializable):完全串行化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞。

Mysql默認事務隔離級別是:REPEATABLE-READ
mysql> select @@grobal.tx_isolation;

參考文獻:
https://www.cnblogs.com/zhoujinyi/p/3437475.html
https://tech.meituan.com/innodb-lock.html

最後更新:2017-04-01 17:13:52

  上一篇:go 明明技術難度更低,為何MySQL DBA工資比Oracle高?
  下一篇:go 又一個項目開源,阿裏已成為中國開源的關鍵力量?