髒讀、幻讀和不可重複讀?爲啥?

clipboard.png
前言:數據庫

一致性是指在事務開始以前和事務結束之後,數據庫的完整性約束沒有被破壞。這是說數據庫事務不能破壞關係數據的完整性以及業務邏輯上的一致性。
例子: 對銀行轉賬事務,無論事務成功仍是失敗,應該保證事務結束後ACCOUNT表中A和B的存款總額爲x元不變。
Isolation 隔離性:併發

數據庫容許多個併發事務同事對數據進行操做,隔離性保證各個事務相互獨立,事務處理時的中間狀態對其它事務是不可見的,以此防止出現數據不一致狀態。
例子: 在Windows中,若是多個進程對同一個文件進行修改是不容許的,Windows經過這種方式來保證不一樣進程的隔離性。
Durable 持久性:性能

一個事務處理結束後,其對數據庫的修改就是永久性的,即便系統故障也不會丟失。
髒讀、幻讀和不可重複讀的概念spa

髒讀:blog

所謂髒讀是指一個事務中訪問到了另一個事務未提交的數據,以下圖:進程

clipboard.png
若是會話 2 更新 age 爲 10,可是在 commit 以前,會話 1 但願獲得 age,那麼會得到的值就是更新前的值。或者若是會話 2 更新了值可是執行了 rollback,而會話 1 拿到的還是 10。這就是髒讀。事務

不可重複讀:ip

一個事務查詢同一條記錄2次,獲得的結果不一致:it

clipboard.png
因爲在讀取中間變動了數據,因此會話 1 事務查詢期間的獲得的結果就不同了。io

幻讀:

一個事務查詢2次,獲得的記錄條數不一致:

clipboard.png
幻讀是不可重複讀的一種特殊場景。

MySQL 數據隔離級別

MySQL 裏有四個隔離級別:

Read uncommttied(能夠讀取未提交數據)
Read committed(能夠讀取已提交數據)
Repeatable read(可重複讀)
Serializable(可串行化)。
不一樣事務隔離級別有不一樣的效果:

clipboard.png
在 InnoDB 中,默認爲 Repeatable 級別,InnoDB 中使用一種被稱爲 next-key locking 的策略來避免幻讀(phantom)現象的產生。

隔離級別越高,越能保證數據的完整性和一致性,可是對併發性能的影響也越大。

相關文章
相關標籤/搜索