欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql并發(fā)控制原理知識點(diǎn)

 更新時(shí)間:2020年02月20日 10:36:43   作者:V  
在本篇文章里小編給大家整理的是一篇關(guān)于mysql并發(fā)控制原理知識點(diǎn)內(nèi)容,需要的朋友們參考下吧。

Mysql是主流的開源關(guān)系型數(shù)據(jù)庫,提供高性能的數(shù)據(jù)存儲服務(wù)。在做后端開發(fā)時(shí),有時(shí)會遇到性能瓶頸,這些瓶頸有時(shí)并不是來自應(yīng)用本身,而是來自數(shù)據(jù)庫層面。

所以所以掌握Mysql的一些底層原理有助于我們更好地理解Mysql,對Mysql進(jìn)行性能調(diào)優(yōu),

從而開發(fā)高性能的后端服務(wù)。

1、mysql的邏輯框架

mysql邏輯框架圖如下:

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

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

也可以使用SSL基于X.509證書認(rèn)證。

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

在解析查詢前,服務(wù)器會先檢查查詢緩存,如果能在其中找到對應(yīng)的查詢結(jié)果,則無需再進(jìn)行查詢解析、優(yōu)化等過程,直接返回查詢結(jié)果。存儲過程、觸發(fā)器、視圖等都在這一層實(shí)現(xiàn)。

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

2、mysql的并發(fā)控制

如果多個線程同時(shí)操作數(shù)據(jù),就有可能引發(fā)并發(fā)控制的問題。

2-1、讀寫鎖

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

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

如果有一個線程需要寫數(shù)據(jù),則應(yīng)該使用“寫鎖”,也成為排它鎖。

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

2-2、鎖粒度

首先明確一個概念:在給定的資源上,需要加鎖的數(shù)據(jù)越少,系統(tǒng)能夠承載的并發(fā)量就越高。

但加鎖也是需要消耗資源的,如果系統(tǒng)花費(fèi)大量的時(shí)間來管理鎖,而不是存取數(shù)據(jù),

那么系統(tǒng)的性能可能會因此受影響。

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

每種存儲引擎都可以實(shí)現(xiàn)自己的鎖策略和鎖粒度。

2-3、表鎖和行鎖

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

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

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

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

所有的存儲引擎都以自己的方式實(shí)現(xiàn)了行級鎖。

3、MVCC

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

因此開銷更低。

主流的關(guān)系型數(shù)據(jù)庫都實(shí)現(xiàn)了MVCC,但實(shí)現(xiàn)機(jī)制各有不同。實(shí)際上MVCC也沒有一個統(tǒng)一的標(biāo)準(zhǔn)。

但大都實(shí)現(xiàn)了非阻塞的讀操作,寫操作也只是鎖定必要的行。

MVCC保證的是每個事務(wù)里面在執(zhí)行期間看到的數(shù)據(jù)都是一致的。

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

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

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

實(shí)際上存儲的并不是實(shí)際的一個時(shí)間戳,而是‘系統(tǒng)版本號'。

每次開啟一個事務(wù),系統(tǒng)版本號都會遞增。事務(wù)開始時(shí),系統(tǒng)版本號會作為事務(wù)的版本號,用來和查詢到的行的版本號進(jìn)行比較。

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

INSERT

保存當(dāng)前系統(tǒng)版本好的作為行版本號

DELETE

保存當(dāng)前的系統(tǒng)版本號到這行數(shù)據(jù)的“刪除版本”。

UPDATE

插入一行新紀(jì)錄,保存當(dāng)前系統(tǒng)版本號作為航版本號,同時(shí)保存當(dāng)前系統(tǒng)版本號到原來的行的“刪除版本”。

SELECT

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

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

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

在事務(wù)之前沒有被刪除。

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

因?yàn)镽EAD UNCOMMITTED總是讀取最新的數(shù)據(jù)防,而不是符合當(dāng)前事務(wù)版本的數(shù)據(jù)行。而SERIALIZABLE則會對所有讀取的行都加鎖。

以上就是mysql的并發(fā)控制原理的詳細(xì)內(nèi)容,如果大家有任何補(bǔ)充可以聯(lián)系腳本之家小編。

相關(guān)文章

  • Mysql Online DDL的使用詳解

    Mysql Online DDL的使用詳解

    在日常DBA運(yùn)維過程中,對表結(jié)構(gòu)進(jìn)行變更算是個普遍的需求了。如果操作的對象是個熱表、大表,難免心里一怵,這些DDL操作是否可以直接執(zhí)行,哪些會影響線上讀寫,哪些會影響主從,甚至導(dǎo)致服務(wù)器壓力驟升,本文做了梳理,希望對大家有所幫助。
    2021-05-05
  • MySQL插入數(shù)據(jù)時(shí)插入無效列的解決方法

    MySQL插入數(shù)據(jù)時(shí)插入無效列的解決方法

    MySQL插入數(shù)據(jù)時(shí)插入無效的列,解決方法是在插入時(shí),給字符串類型的字段值加上雙引號
    2014-07-07
  • Mysql5.7及以上版本 ONLY_FULL_GROUP_BY報(bào)錯的解決方法

    Mysql5.7及以上版本 ONLY_FULL_GROUP_BY報(bào)錯的解決方法

    這篇文章主要介紹了Mysql5.7及以上版本 ONLY_FULL_GROUP_BY報(bào)錯的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • mysql MGR 單主多主模式切換知識點(diǎn)詳解

    mysql MGR 單主多主模式切換知識點(diǎn)詳解

    在本篇文章里小編給大家整理了關(guān)于mysql MGR 單主多主模式切換知識點(diǎn)詳解內(nèi)容,需要的朋友們可以參考下。
    2020-03-03
  • Mysql 執(zhí)行一條語句的整個過程詳細(xì)

    Mysql 執(zhí)行一條語句的整個過程詳細(xì)

    這篇文章主要介紹了Mysql 執(zhí)行一條語句的整個詳細(xì)過程,Mysql的邏輯架構(gòu)整體分為兩部分,Server層和存儲引擎層,下面文章內(nèi)容具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對你有所幫助
    2022-02-02
  • MySql數(shù)據(jù)庫基礎(chǔ)之子查詢詳解

    MySql數(shù)據(jù)庫基礎(chǔ)之子查詢詳解

    所謂子查詢是指在一個查詢中嵌套了其他的若干查詢,即在一個SELECT查詢語句的WHERE或FROM子句中包含另一個SELECT查詢語句,下面這篇文章主要給大家介紹了關(guān)于MySQL子查詢的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • IDEA連接MySQL數(shù)據(jù)庫并執(zhí)行SQL語句使用數(shù)據(jù)圖文詳解

    IDEA連接MySQL數(shù)據(jù)庫并執(zhí)行SQL語句使用數(shù)據(jù)圖文詳解

    使用idea連接本地MySQL數(shù)據(jù)庫,就可以很方便的看到數(shù)據(jù)庫的內(nèi)容,還可以進(jìn)行基本的增加,刪除,修改操作,下面這篇文章主要給大家介紹了關(guān)于IDEA連接MySQL數(shù)據(jù)庫并執(zhí)行SQL語句使用數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • Redis什么是熱Key問題以及如何解決熱Key問題

    Redis什么是熱Key問題以及如何解決熱Key問題

    這篇文章主要介紹了Redis什么是熱Key問題以及如何解決熱Key問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 解決ERROR?1129?(HY000):?Host?‘xxx‘?is?blocked?because?of?many問題

    解決ERROR?1129?(HY000):?Host?‘xxx‘?is?blocked?because?

    這篇文章主要介紹了解決ERROR?1129?(HY000):?Host?‘xxx‘?is?blocked?because?of?many問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Mysql 取字段值逗號第一個數(shù)據(jù)的查詢語句

    Mysql 取字段值逗號第一個數(shù)據(jù)的查詢語句

    Mysql 取字段值逗號第一個數(shù)據(jù),在某些情況下還是比較實(shí)用的,主要使用到了left函數(shù)及其他等等,感興趣的朋友可以參考下
    2013-10-10

最新評論