mysql併發操作 mysql併發控制原理知識點

2021-10-17 13:58:18 字數 2339 閱讀 5995

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則會對所有讀取的行都加鎖。

mysql併發讀寫 mysql 的讀寫鎖與併發控制

1.無論何時只要有多個查詢在同一時刻修改資料,都會產生併發控制的問題 2.討論mysql在兩個層面,伺服器層和儲存引擎層,如何併發控制讀寫 3.舉了個mbox郵箱檔案的例子,說如果有多個程序同時對mbox檔案寫東西,那麼在檔案的末尾會,交叉混亂的新增,比如程序1寫了幾行,程序2也寫了幾行,互相交叉,...

mysql 併發控制 mysql併發控制

mysql併發控制 當有多個查詢需要同時修改同乙個資料,就會產生併發控制的問題。mysql可以在兩個層面進行併發控制 伺服器層和儲存引擎層。mysql通過加鎖實現併發控制 鎖有兩類 讀鎖 共享鎖,即乙個讀鎖不會阻塞其它讀鎖,多個使用者可同時讀取同乙個資源,而不互相干擾。寫鎖 排他鎖,即乙個寫鎖會阻塞...

mysql併發量是多少 簡書 MySQL的併發控制

當有多個查詢在同一時刻修改同一資料時,便會產生併發問題。mysql通過鎖來進行併發控制。讀寫鎖讀鎖又稱共享鎖 s鎖 讀鎖互不干擾,多個客戶在同一時刻可以同時讀取同乙個資源。寫鎖又稱排他鎖 x鎖 寫鎖則是排他的,寫鎖會阻塞其他寫鎖和讀鎖,以確保在給定時間裡,只有乙個使用者執行寫入,並防止其他使用者讀取...