中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

數據庫的讀一致性分析

發布時間:2020-07-29 01:04:15 來源:網絡 閱讀:931 作者:zfz_linux_boy 欄目:數據庫

前言

提起數據庫的事務,我們就會想到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


  • Innodb查找insert/update SVN小于等于當前事務的SVN的行,如果是小于,說明行之前就已經存在,如果是等于,說明這行是事務本身修改過的。

  • 行的刪除時間列要么為空(說明該行未被刪除)要么刪除時間列的SVN大于當前事物的SVN(表示行是在事物開始之后被刪除的)。


只有記錄滿足以上兩條,才會被select語句返回!


這就是為何MYSQL在RR級別下,一個事務中是肯定讀取不到“之后建立的”別的事務提交的數據,但是在本事務中更新的數據,可以讀取出來的緣故!


INSERT


  • 插入之后以當前事務的SVN號更新創建列


DELETE


  • 刪除之后,用當前SVN更新刪除列


UPDATE


  • 更新創建列為當前SVN,同時更新刪除列為update之前的創建列的SVN值


這樣設計的優點是大部分的讀操作都不用加鎖了,而且是非阻塞的讀取操作,使數據庫操作簡單,性能好,不足之處是增加了存儲開銷,需要額外的維護工作。


還是那句老話,用空間換取時間!




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

白城市| 颍上县| 涡阳县| 衡东县| 湘阴县| 深州市| 新龙县| 博罗县| 丰原市| 青田县| 庆云县| 江北区| 紫阳县| 容城县| 桐城市| 罗源县| 吴江市| 宜君县| 茂名市| 寻乌县| 阳东县| 博客| 温泉县| 新和县| 福海县| 贡山| 扶绥县| 阳西县| 邢台市| 德令哈市| 晋江市| 沿河| 梁山县| 香河县| 濮阳县| 秦皇岛市| 陆川县| 永仁县| 温州市| 潼南县| 东宁县|