mysql併發控制原理知識點
Mysql是主流的開源關係型資料庫,提供高效能的資料儲存服務。在做後端開發時,有時會遇到效能瓶頸,這些瓶頸有時並不是來自應用本身,而是來自資料庫層面。
所以所以掌握Mysql的一些底層原理有助於我們更好地理解Mysql,對Mysql進行效能調優,
從而開發高效能的後端服務。
1、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 READ和READ COMMITTED兩個隔離級別下工作,其它兩個隔離級別不能工作。
因為READ UNCOMMITTED總是讀取最新的資料防,而不是符合當前事務版本的資料行。而SERIALIZABLE則會對所有讀取的行都加鎖
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69957453/viewspace-2749948/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql併發控制MySql
- MySQL知識點MySql
- 值得收藏,揭秘 MySQL 多版本併發控制實現原理MySql
- MySql 三大知識點,索引、鎖、事務,原理分析MySql索引
- Java併發相關知識點梳理和研究Java
- MySQL知識點總結MySql
- Java併發知識點快速複習手冊(上)Java
- Java併發知識點快速複習手冊(下)Java
- MySQL如何加鎖控制併發MySql
- MySQL MVCC知識點彙總MySqlMVC
- mysql 常用知識點總結MySql
- MySQL 叢集知識點整理MySql
- MySQL 索引知識點總結MySql索引
- Java併發--基礎知識Java
- 作業系統併發的一些知識點梳理作業系統
- mysql的一些知識點MySql
- 總結 MySQL 相關知識點MySql
- 知識點:Python中的列表合併操作Python
- MySQL-16.MVCC(多版本併發控制)MySqlMVC
- 跳出初學MySQL知識的原理整理(一)MySql
- MySQL 常用易混淆知識點總結MySql
- Golang 基礎之併發知識 (三)Golang
- 【Mysql】深入理解 MVCC 多版本併發控制MySqlMVC
- MySQL多版本併發控制——MVCC機制分析MySqlMVC
- vue知識點整理(轉發)Vue
- 整理:iOS開發知識點iOS
- MySQL 知識MySql
- MySQL知識MySql
- 併發控制
- web開發知識體系中必要的知識點Web
- MySql 三大知識點——索引、鎖、事務!MySql索引
- 【學習】MySQL基礎知識要點-001MySql
- 必考知識點-JavaScript型別轉換(講原理)JavaScript型別
- 【MySQL速通篇001】5000字吃透MySQL部分重要知識點MySql
- MySQL原理簡介—8.MySQL併發事務處理MySql
- java併發程式設計系列:java併發程式設計背景知識Java程式設計
- 深入理解Mysql——鎖、事務與併發控制MySql
- 深入理解 MySQL—鎖、事務與併發控制MySql