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

MySQL數據庫鎖機制原理解析

 更新時間:2020年12月08日 11:41:23   作者:北方有魚  
這篇文章主要介紹了MySQL數據庫鎖機制原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

在并發(fā)訪問情況下,很有可能出現不可重復讀等等讀現象。為了更好的應對高并發(fā),封鎖、時間戳、樂觀并發(fā)控制(樂觀鎖)、悲觀并發(fā)控制(悲觀鎖)都是并發(fā)控制采用的主要技術方式。

鎖分類

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

②、按鎖的粒度劃分:表級鎖、行級鎖、頁級鎖

③、按鎖級別劃分:共享鎖、排他鎖

④、按加鎖方式劃分:自動鎖、顯示鎖

⑤、按使用方式劃分:樂觀鎖、悲觀鎖

樂觀鎖和悲觀鎖

樂觀并發(fā)控制和悲觀并發(fā)控制是并發(fā)控制采用的主要方法。樂觀鎖和悲觀鎖不僅在關系數據庫里應用,在Hibernate、Memcache等等也有相關概念。

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

備注,在MySQL中使用悲觀鎖,必須關閉MySQL的自動提交,set autocommit=0。MySQL默認使用自動提交autocommit模式,也即你執(zhí)行一個更新操作,MySQL會自動將結果提交。

例如:使用select...for update方式將數據鎖住,也就是開啟了排他鎖

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

悲觀鎖

優(yōu)點:悲觀鎖利用數據庫中的鎖機制來實現數據變化的順序執(zhí)行,這是最有效的辦法

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

樂觀鎖

優(yōu)點:樂觀鎖不在數據庫上加鎖,任何事務都可以對數據進行操作,在更新時才進行校驗,這樣就避免了悲觀鎖造成的吞吐量下降的劣勢。

缺點:樂觀鎖因為是通過我們人為實現的,它僅僅適用于我們自己業(yè)務中,如果有外來事務插入,那么就可能發(fā)生錯誤。

  • MySQL常用存儲引擎的鎖機制
  • BDB:支持頁級鎖和表級鎖,默認是頁級鎖
  • InnoDB:支持行級鎖和表級鎖,默認是行級鎖
  • MyISAM &Memory:這兩個存儲引擎都是采用表級鎖

MySQL中排它鎖和共享鎖

排它鎖(exclusive locck)

排它鎖又叫寫鎖,如果事務T對A加上排它鎖,則其它事務都不能對A加任何類型的鎖。獲準排它鎖的事務既能讀數據,又能寫數據。

用法:SELECT ... FOR UPDATE

共享鎖(share lock)

共享鎖又叫讀鎖,如果事務T對A加上共享鎖,則其它事務只能對A再加共享鎖,不能加其它鎖。獲準共享鎖的事務只能讀數據,不能寫數據。

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

MySQL中的行級鎖、表級鎖和頁級鎖

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

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

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

開銷和加鎖時間界于表鎖和行鎖之間;會出現死鎖;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Mysql數據庫分庫分表全面瓦解

    Mysql數據庫分庫分表全面瓦解

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

    Win10安裝MySQL5.7.18winX64 啟動服務器失敗并且沒有錯誤提示

    這篇文章主要介紹了Win10安裝MySQL5.7.18winX64 啟動服務器失敗并且沒有錯誤提示,需要的朋友可以參考下
    2017-06-06
  • MySQL 5.7升級8.0報異常:ONLY_FULL_GROUP_BY的問題解決

    MySQL 5.7升級8.0報異常:ONLY_FULL_GROUP_BY的問題解決

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

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

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

    MySQL中order by在子查詢中失效的問題解決方案

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

    Navicat連接MySQL時報10060、1045錯誤及my.ini位置問題

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

    MySql中特殊運算符的使用方法總結

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

    mysql 5.7.17 zip安裝配置教程 mysql啟動失敗的解決方法

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

    Mysql主從同步的實現原理

    這篇文章主要介紹了Mysql主從同步的實現原理,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • MySQL 8.0數據字典的初始化與啟動流程

    MySQL 8.0數據字典的初始化與啟動流程

    數據字典(Data Dictionary, DD)用來存儲數據庫內部對象的信息,這些信息也被稱為元數據(Metadata),包括schema名稱、表結構、存儲過程的定義等,本文主要介紹MySQL 8.0數據字典的基本概念和數據字典的初始化與啟動加載的主要流程,需要的朋友可以參考下
    2024-06-06

最新評論