1. 程式人生 > 資料庫 >MySQL資料庫鎖機制原理解析

MySQL資料庫鎖機制原理解析

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

鎖分類

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

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

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

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

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

樂觀鎖和悲觀鎖

樂觀併發控制和悲觀併發控制是併發控制採用的主要方法。樂觀鎖和悲觀鎖不僅在關係資料庫裡應用,在Hibernate、Memcache等等也有相關概念。

悲觀鎖:也即悲觀併發控制,Pessimistic Concurrency Controller,縮寫PCC。悲觀鎖是指在資料處理過程,使資料處於鎖定狀態,一般使用資料庫的鎖機制實現。

備註,在MySQL中使用悲觀鎖,必須關閉MySQL的自動提交,set autocommit=0。MySQL預設使用自動提交autocommit模式,也即你執行一個更新操作,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;

悲觀鎖

優點:悲觀鎖利用資料庫中的鎖機制來實現資料變化的順序執行,這是最有效的辦法

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

樂觀鎖

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

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

  • 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引擎支援行級鎖和表級鎖,只有在通過索引條件檢索資料的時候,才使用行級鎖,否就使用表級鎖。行級鎖開銷大,加鎖慢,鎖定粒度最小,發生鎖衝突概率最低,併發度最高

表級鎖:表級鎖分為表共享鎖和表獨佔鎖。表級鎖開銷小,加鎖快,鎖定粒度大、發生鎖衝突最高,併發度最低

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

開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般

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