亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

數據庫的讀一致性分析

發布時間: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

阿荣旗| 乡宁县| 闽清县| 清流县| 来凤县| 堆龙德庆县| 武宣县| 南昌县| 阿拉善左旗| 安泽县| 平远县| 涟水县| 嘉黎县| 乌鲁木齐县| 西昌市| 大宁县| 泰宁县| 许昌县| 陕西省| 阜平县| 鹰潭市| 万宁市| 竹溪县| 黄梅县| 博兴县| 五指山市| 石台县| 盘锦市| 吴江市| 仙居县| 乐陵市| 朝阳县| 峨山| 宜宾市| 浏阳市| 南通市| 务川| 临沭县| 澜沧| 郯城县| 左权县|