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

溫馨提示×

溫馨提示×

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

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

掌握mysql的底層原理之并發控制

發布時間:2020-05-11 17:03:32 來源:億速云 閱讀:194 作者:三月 欄目:MySQL數據庫

文主要給大家介紹mysql的底層原理之并發控制,文章內容都是筆者用心摘選和編輯的,具有一定的針對性,對大家的參考意義還是比較大的,下面跟筆者一起了解下mysql的底層原理之并發控制吧。                                                

1、mysql的邏輯框架

mysql邏輯框架圖如下:

掌握mysql的底層原理之并發控制

最上層是處理客戶端過來的連接的

主要做連接處理、授權認證、安全等。Mysql在這一層維護了一個線程池,用于處理來自客戶端的連接。Mysql可以使用用戶名密碼認證,

也可以使用SSL基于X.509證書認證。

第二層由三部分組成:查詢緩存、解析器、優化器。解析器用來解析SQL語句,優化器會對解析之后的語句進行優化。

在解析查詢前,云服務器會先檢查查詢緩存,如果能在其中找到對應的查詢結果,則無需再進行查詢解析、優化等過程,直接返回查詢結果。存儲過程、觸發器、視圖等都在這一層實現。

第三層是存儲引擎,存儲引擎負責在MySQL中存儲數據、提取數據、開啟一個事務等等。存儲引擎通過API與上層進行通信,這些API屏蔽了不同存儲引擎之間的差異,使得這些差異對上層查詢過程透明。存儲引擎不會去解析SQL。mysql最常用的存儲引擎是InnoDB。

2、mysql的并發控制

如果多個線程同時操作數據,就有可能引發并發控制的問題。

2-1、讀寫鎖

如果多個線程都只是讀數據,其實可以一起讀,不會互相影響,這個時候應該使用“讀鎖”,也稱為共享鎖。

獲取讀鎖的線程之間互相不會阻塞,可以同時讀取一個資源。

如果有一個線程需要寫數據,則應該使用“寫鎖”,也成為排它鎖。

寫鎖會阻塞其它的寫鎖和讀鎖,直至寫操作完成。

2-2、鎖粒度

首先明確一個概念:在給定的資源上,需要加鎖的數據越少,系統能夠承載的并發量就越高。

但加鎖也是需要消耗資源的,如果系統花費大量的時間來管理鎖,而不是存取數據,

那么系統的性能可能會因此受影響。

所以一個好的“鎖策略”就是要在鎖的開銷和數據的安全性之間尋求平衡,Mysql支持多個存儲引擎的架構,

每種存儲引擎都可以實現自己的鎖策略和鎖粒度。

2-3、表鎖和行鎖

表鎖顧名思義就是鎖住整張表。表鎖開銷比較小。對表加寫鎖后,其它用戶對這張表的所有讀寫操作都會被阻塞。

在Mysql中,盡管存儲引擎可以提供自己的鎖,但Mysql有時候也會使用表鎖,比如ALTER TABLE之類的語句。

寫鎖比讀鎖有更高的優先級,因此一個寫鎖請求可能會插入到讀鎖隊列的前面。

行級鎖即鎖住整行,可以最大程度地支持并發處理,但加解鎖的開銷也會比較大。行級鎖只在儲存引擎層實現,

所有的存儲引擎都以自己的方式實現了行級鎖。

3、MVCC

MVCC即“多版本并發控制”,可以認為MVCC是行級鎖的一個變種,但是它在很多情況下避免了加鎖操作,

因此開銷更低。

主流的關系型數據庫都實現了MVCC,但實現機制各有不同。實際上MVCC也沒有一個統一的標準。

但大都實現了非阻塞的讀操作,寫操作也只是鎖定必要的行。

MVCC保證的是每個事務里面在執行期間看到的數據都是一致的。

但不同的事務由于開始的時間不同,所以可能對同一張表,同一時刻看到的數據是不一樣的。

在Mysql的InnoDB引擎,是通過給每行記錄后面保存兩個隱藏的列來實現的。

一個是保存行的創建時間,另一個保存了行的過期時間(或刪除時間)。

實際上存儲的并不是實際的一個時間戳,而是‘系統版本號’。

每次開啟一個事務,系統版本號都會遞增。事務開始時,系統版本號會作為事務的版本號,用來和查詢到的行的版本號進行比較。

下面分別介紹常見的CRUD操作中版本號是怎么工作的:

INSERT

保存當前系統版本好的作為行版本號

DELETE

保存當前的系統版本號到這行數據的“刪除版本”。

UPDATE

插入一行新紀錄,保存當前系統版本號作為航版本號,同時保存當前系統版本號到原來的行的“刪除版本”。

SELECT

只查找版本早于當前事務版本的行。這樣可以保證事務讀取的行,要么之前就存在,

要么是這個事務本身自己插入或者修改的。

行的“刪除版本”要么未定義,要么大于當前事務版本號。這樣可以確保事務讀取到的行,

在事務之前沒有被刪除。

MVCC只在REPEATABLE READREAD COMMITTED兩個隔離級別下工作,其它兩個隔離級別不能工作。

因為READ UNCOMMITTED總是讀取最新的數據防,而不是符合當前事務版本的數據行。而SERIALIZABLE則會對所有讀取的行都加鎖。

看完以上關于mysql的底層原理之并發控制,很多讀者朋友肯定多少有一定的了解,如需獲取更多的行業知識信息 ,可以持續關注我們的行業資訊欄目的。

向AI問一下細節

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

AI

漠河县| 满洲里市| 英吉沙县| 天祝| 东方市| 金川县| 明光市| 庐江县| 武乡县| 梅州市| 永丰县| 青铜峡市| 万载县| 习水县| 巴里| 绵阳市| 邳州市| 壤塘县| 汽车| 崇明县| 玉环县| 阳山县| 罗江县| 沙坪坝区| 扶风县| 安顺市| 潮州市| 汨罗市| 淮阳县| 南靖县| 奎屯市| 洪雅县| 团风县| 木兰县| 德昌县| 长兴县| 横山县| 武义县| 商洛市| 江西省| 乐至县|