MySQL基礎之資料庫的鎖機制

2021-08-14 06:41:07 字數 2178 閱讀 3033

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

###鎖分類

①、按操作劃分:dml鎖,ddl鎖

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

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

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

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

###樂觀鎖和悲觀鎖

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

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

備註,在mysql中使用悲觀鎖,必須關閉mysql的自動提交,set autocommit=0。mysql預設使用自動提交autocommit模式,也即你執行乙個更新操作,mysql會自動將結果提交。

//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;

本例子使用select…for update方式將資料鎖住,也就是開啟了排他鎖

悲觀鎖優缺點:

悲觀併發控制(悲觀鎖)採用"先取鎖再分"的保守策略,為資料處理提供了安全的保證。但在效率方面,加鎖機制會產生額外的開銷,增加產生死鎖的機會。

樂觀鎖:相對悲觀鎖來說,樂觀鎖是通過記錄資料版本的方式實現樂觀鎖。為資料增加乙個版本標識,讀取資料時,將版本標識一起讀出,資料沒更新一次,就對版本標識進行更新。

樂觀鎖優缺點:

樂觀鎖認為事務直接競爭的概率是很小的,在提交的時候才鎖定,所以不會產生死鎖。但是如果兩個事務同時讀取資料庫的某一行,這時,就會發現樂觀鎖的弊端。

###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支援頁級鎖。

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

MySQL資料庫的鎖機制

原文首發於 本文出自 rebornchang的部落格 拋開資料庫引擎說資料庫鎖機制的都是流氓 引言 mysql資料庫的引擎分為三種,myisam isam innodb以及memory,具體的引擎型別效能比較可以baidu到,這裡就不多說了,本文中所說的鎖機制基於innodb引擎,那為啥說基於inn...

Mysql資料庫的鎖機制

鎖機制 當客戶端操作表 記錄 時,為了保證操作的隔離性 多個客戶端操作不能相互影響 通過加鎖來處理。操作方面 讀鎖 讀操作時增加的鎖,也叫共享鎖,s lock。特徵是所有人都只可以讀,只有釋放鎖之後才可以寫。寫鎖 寫操作時增加的鎖,也叫獨佔鎖或排他鎖,x lock。特徵,只有鎖表的客戶可以操作 讀寫...

MySQL資料庫的鎖機制

在併發訪問情況下,很有可能出現不可重複讀等等讀現象。為了更好的應對高併發,封鎖 時間戳 樂觀併發控制 樂觀鎖 悲觀併發控制 悲觀鎖 都是併發控制採用的主要技術方式。按操作劃分 dml鎖,ddl鎖 按鎖的粒度劃分 表級鎖 行級鎖 頁級鎖 按鎖級別劃分 共享鎖 排他鎖 按加鎖方式劃分 自動鎖 顯示鎖 按...