您好,登錄后才能下訂單哦!
前言
提起數據庫的事務,我們就會想到ACID特性:
A:Atomicity 原子性 事務中包含的各種操作,要么一起成功,要么全部失敗
C:Consistency 一致性 事務從一個一致性的狀態轉變成另一個一致性的狀態
I:Isolation 隔離性 各個事務之間的可見程度
D:Durability 持久性 數據庫中的數據的改變應該是可以持久存儲的
本篇博客將以MySQL為例分析數據庫的讀一致性。想分析清楚一致性,必先了解隔離級別。
數據庫的隔離級別
在SQL標準中是定義了幾種隔離級別的: RU:Read Uncommitted(讀取未提交內容) RC:Read Committed(讀取提交內容) RR:Repeatable Read(可重讀) Serializable(可串行化) Serializable這種隔離級別最高,若幾個事務對同一份數據進行操作(即便是查詢操作),它也針對每一個事務進行排序,嚴格按照排序進行事務的執行,顯然解決了事務可能存在的沖突,但是會導致大量的超時以及鎖競爭,因此在實際中大多是不會采用此種隔離級別的。 Oracle默認的隔離級別是:RC,并且Oracle只支持RC和Serializable這2種級別。RC,簡單一句話,就是一個事務中只能看到另一個事務已經提交的數據的改變。那么RC會帶來什么問題呢?在同一事務中,同一條SELECT語句可能會返回不一樣的結果,即會產生 不可重復讀。 MySQL默認的隔離級別是:RR。在該隔離級別下,可以保證在同一事務中,獲取到的數據一致。這就是所謂的MySQL的讀一致性,它的實現基于MVCC,后文中會分析。 RU可以讓所有事務都讀取到其他事務未提交的數據,會帶來 臟讀,同Serializable一樣,在實際中,應用較少。 |
淺析MySQL MVCC原理
MVCC(MultiVersion Concurrency Control )多版本并發控制,可以簡單的理解成為一個row lock的一個變種,只是在必要的時候加行鎖。MySQL InnoDB的MVCC簡單來講是通過給表添加兩列隱藏列來是實現的。一列是insert/update的時間,另一列是delete的時間,當然這里的時間并不是真正的時間,而是指SVN,即System Version Number,系統版本號,就是一個數字。每次開啟一個事務,那么SVN號遞增。 現在討論在REPEATABLE READ下的MVCC實現: SELECT
只有記錄滿足以上兩條,才會被select語句返回! 這就是為何MYSQL在RR級別下,一個事務中是肯定讀取不到“之后建立的”別的事務提交的數據,但是在本事務中更新的數據,可以讀取出來的緣故! INSERT
DELETE
UPDATE
這樣設計的優點是大部分的讀操作都不用加鎖了,而且是非阻塞的讀取操作,使數據庫操作簡單,性能好,不足之處是增加了存儲開銷,需要額外的維護工作。 還是那句老話,用空間換取時間! |
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。