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

MySQL數(shù)據(jù)庫(kù)鎖機(jī)制原理解析

 更新時(shí)間:2020年12月08日 11:41:23   作者:北方有魚(yú)  
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)鎖機(jī)制原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

在并發(fā)訪問(wèn)情況下,很有可能出現(xiàn)不可重復(fù)讀等等讀現(xiàn)象。為了更好的應(yīng)對(duì)高并發(fā),封鎖、時(shí)間戳、樂(lè)觀并發(fā)控制(樂(lè)觀鎖)、悲觀并發(fā)控制(悲觀鎖)都是并發(fā)控制采用的主要技術(shù)方式。

鎖分類(lèi)

①、按操作劃分:DML鎖,DDL鎖

②、按鎖的粒度劃分:表級(jí)鎖、行級(jí)鎖、頁(yè)級(jí)鎖

③、按鎖級(jí)別劃分:共享鎖、排他鎖

④、按加鎖方式劃分:自動(dòng)鎖、顯示鎖

⑤、按使用方式劃分:樂(lè)觀鎖、悲觀鎖

樂(lè)觀鎖和悲觀鎖

樂(lè)觀并發(fā)控制和悲觀并發(fā)控制是并發(fā)控制采用的主要方法。樂(lè)觀鎖和悲觀鎖不僅在關(guān)系數(shù)據(jù)庫(kù)里應(yīng)用,在Hibernate、Memcache等等也有相關(guān)概念。

悲觀鎖:也即悲觀并發(fā)控制,Pessimistic Concurrency Controller,縮寫(xiě)PCC。悲觀鎖是指在數(shù)據(jù)處理過(guò)程,使數(shù)據(jù)處于鎖定狀態(tài),一般使用數(shù)據(jù)庫(kù)的鎖機(jī)制實(shí)現(xiàn)。

備注,在MySQL中使用悲觀鎖,必須關(guān)閉MySQL的自動(dòng)提交,set autocommit=0。MySQL默認(rèn)使用自動(dòng)提交autocommit模式,也即你執(zhí)行一個(gè)更新操作,MySQL會(huì)自動(dòng)將結(jié)果提交。

例如:使用select...for update方式將數(shù)據(jù)鎖住,也就是開(kāi)啟了排他鎖

//0.開(kāi)始事務(wù)
begin;/begin work;/start transaction; (三者選一就可
//1.查詢出商品信息
select status from t_goods where id=1 for update;
//2.根據(jù)商品信息生成訂單
insert into t_orders (id,goods_id) values (null,1);
//3.修改商品status為2
update t_goods set status=2;
//4.提交事務(wù)
commit;/commit work;

悲觀鎖

優(yōu)點(diǎn):悲觀鎖利用數(shù)據(jù)庫(kù)中的鎖機(jī)制來(lái)實(shí)現(xiàn)數(shù)據(jù)變化的順序執(zhí)行,這是最有效的辦法

缺點(diǎn):加鎖機(jī)制會(huì)產(chǎn)生額外的開(kāi)銷(xiāo),增加產(chǎn)生死鎖的機(jī)會(huì)。一個(gè)事務(wù)用悲觀鎖對(duì)數(shù)據(jù)加鎖之后,其他事務(wù)將不能對(duì)加鎖的數(shù)據(jù)進(jìn)行除了查詢以外的所有操作,如果該事務(wù)執(zhí)行時(shí)間很長(zhǎng),那么其他事務(wù)將一直等待,那勢(shì)必影響我們系統(tǒng)的吞吐量。

樂(lè)觀鎖

優(yōu)點(diǎn):樂(lè)觀鎖不在數(shù)據(jù)庫(kù)上加鎖,任何事務(wù)都可以對(duì)數(shù)據(jù)進(jìn)行操作,在更新時(shí)才進(jìn)行校驗(yàn),這樣就避免了悲觀鎖造成的吞吐量下降的劣勢(shì)。

缺點(diǎn):樂(lè)觀鎖因?yàn)槭峭ㄟ^(guò)我們?nèi)藶閷?shí)現(xiàn)的,它僅僅適用于我們自己業(yè)務(wù)中,如果有外來(lái)事務(wù)插入,那么就可能發(fā)生錯(cuò)誤。

  • MySQL常用存儲(chǔ)引擎的鎖機(jī)制
  • BDB:支持頁(yè)級(jí)鎖和表級(jí)鎖,默認(rèn)是頁(yè)級(jí)鎖
  • InnoDB:支持行級(jí)鎖和表級(jí)鎖,默認(rèn)是行級(jí)鎖
  • MyISAM &Memory:這兩個(gè)存儲(chǔ)引擎都是采用表級(jí)鎖

MySQL中排它鎖和共享鎖

排它鎖(exclusive locck)

排它鎖又叫寫(xiě)鎖,如果事務(wù)T對(duì)A加上排它鎖,則其它事務(wù)都不能對(duì)A加任何類(lèi)型的鎖。獲準(zhǔn)排它鎖的事務(wù)既能讀數(shù)據(jù),又能寫(xiě)數(shù)據(jù)。

用法:SELECT ... FOR UPDATE

共享鎖(share lock)

共享鎖又叫讀鎖,如果事務(wù)T對(duì)A加上共享鎖,則其它事務(wù)只能對(duì)A再加共享鎖,不能加其它鎖。獲準(zhǔn)共享鎖的事務(wù)只能讀數(shù)據(jù),不能寫(xiě)數(shù)據(jù)。

用法:SELECT ... LOCK IN SHARE MODE;

MySQL中的行級(jí)鎖、表級(jí)鎖和頁(yè)級(jí)鎖

行級(jí)鎖:行級(jí)鎖分為共享鎖和排它鎖。行級(jí)鎖是Mysql中鎖定粒度最細(xì)的鎖。InnoDB引擎支持行級(jí)鎖和表級(jí)鎖,只有在通過(guò)索引條件檢索數(shù)據(jù)的時(shí)候,才使用行級(jí)鎖,否就使用表級(jí)鎖。行級(jí)鎖開(kāi)銷(xiāo)大,加鎖慢,鎖定粒度最小,發(fā)生鎖沖突概率最低,并發(fā)度最高

表級(jí)鎖:表級(jí)鎖分為表共享鎖和表獨(dú)占鎖。表級(jí)鎖開(kāi)銷(xiāo)小,加鎖快,鎖定粒度大、發(fā)生鎖沖突最高,并發(fā)度最低

頁(yè)級(jí)鎖:頁(yè)級(jí)鎖是MySQL中鎖定粒度介于行級(jí)鎖和表級(jí)鎖中間的一種鎖。表級(jí)鎖速度快,但沖突多,行級(jí)沖突少,但速度慢。所以取了折衷的頁(yè)級(jí),一次鎖定相鄰的一組記錄。BDB支持頁(yè)級(jí)鎖。

開(kāi)銷(xiāo)和加鎖時(shí)間界于表鎖和行鎖之間;會(huì)出現(xiàn)死鎖;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mysql數(shù)據(jù)庫(kù)分庫(kù)分表全面瓦解

    Mysql數(shù)據(jù)庫(kù)分庫(kù)分表全面瓦解

    物理服務(wù)機(jī)的CPU、內(nèi)存、存儲(chǔ)設(shè)備、連接數(shù)等資源有限,某個(gè)時(shí)段大量連接同時(shí)執(zhí)行操作,會(huì)導(dǎo)致數(shù)據(jù)庫(kù)在處理上遇到性能瓶頸。為了解決這個(gè)問(wèn)題,行業(yè)先驅(qū)門(mén)充分發(fā)揚(yáng)了分而治之的思想,對(duì)大庫(kù)表進(jìn)行分割
    2022-01-01
  • Win10安裝MySQL5.7.18winX64 啟動(dòng)服務(wù)器失敗并且沒(méi)有錯(cuò)誤提示

    Win10安裝MySQL5.7.18winX64 啟動(dòng)服務(wù)器失敗并且沒(méi)有錯(cuò)誤提示

    這篇文章主要介紹了Win10安裝MySQL5.7.18winX64 啟動(dòng)服務(wù)器失敗并且沒(méi)有錯(cuò)誤提示,需要的朋友可以參考下
    2017-06-06
  • MySQL 5.7升級(jí)8.0報(bào)異常:ONLY_FULL_GROUP_BY的問(wèn)題解決

    MySQL 5.7升級(jí)8.0報(bào)異常:ONLY_FULL_GROUP_BY的問(wèn)題解決

    本文主要介紹了MySQL 5.7升級(jí)8.0報(bào)異常的問(wèn)題解決,主要是ONLY_FULL_GROUP_BY,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • MySQL中NULLIF?、IFNULL、IF的用法和區(qū)別舉例詳解

    MySQL中NULLIF?、IFNULL、IF的用法和區(qū)別舉例詳解

    這篇文章主要給大家介紹了關(guān)于MySQL中NULLIF?、IFNULL、IF的用法和區(qū)別的相關(guān)資料,nullif和ifnull都是MySQL中用于處理NULL值的函數(shù),但它們的用法和作用略有不同,下面給大家詳細(xì)介紹下,需要的朋友可以參考下
    2024-05-05
  • MySQL中order by在子查詢中失效的問(wèn)題解決方案

    MySQL中order by在子查詢中失效的問(wèn)題解決方案

    這篇文章主要介紹了MySQL中order by在子查詢中失效的問(wèn)題解決,文中補(bǔ)充介紹了Mysql 5.7版本導(dǎo)致的子查詢order by排序無(wú)效問(wèn)題的探究,需要的朋友可以參考下
    2023-07-07
  • Navicat連接MySQL時(shí)報(bào)10060、1045錯(cuò)誤及my.ini位置問(wèn)題

    Navicat連接MySQL時(shí)報(bào)10060、1045錯(cuò)誤及my.ini位置問(wèn)題

    這篇文章主要介紹了Navicat連接MySQL的10060及1045報(bào)錯(cuò),my.ini位置,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • MySql中特殊運(yùn)算符的使用方法總結(jié)

    MySql中特殊運(yùn)算符的使用方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于MySql中特殊運(yùn)算符的使用方法,分別介紹的是<=> 安全比較運(yùn)算符、:= 賦值的作用、@ 用戶變量以及@@ 系統(tǒng)變量,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • mysql 5.7.17 zip安裝配置教程 mysql啟動(dòng)失敗的解決方法

    mysql 5.7.17 zip安裝配置教程 mysql啟動(dòng)失敗的解決方法

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.17 zip安裝配置教程,以及mysql啟動(dòng)失敗的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Mysql主從同步的實(shí)現(xiàn)原理

    Mysql主從同步的實(shí)現(xiàn)原理

    這篇文章主要介紹了Mysql主從同步的實(shí)現(xiàn)原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • MySQL 8.0數(shù)據(jù)字典的初始化與啟動(dòng)流程

    MySQL 8.0數(shù)據(jù)字典的初始化與啟動(dòng)流程

    數(shù)據(jù)字典(Data Dictionary, DD)用來(lái)存儲(chǔ)數(shù)據(jù)庫(kù)內(nèi)部對(duì)象的信息,這些信息也被稱為元數(shù)據(jù)(Metadata),包括schema名稱、表結(jié)構(gòu)、存儲(chǔ)過(guò)程的定義等,本文主要介紹MySQL 8.0數(shù)據(jù)字典的基本概念和數(shù)據(jù)字典的初始化與啟動(dòng)加載的主要流程,需要的朋友可以參考下
    2024-06-06

最新評(píng)論