MySQL資料庫的鎖機制

2022-06-14 05:00:11 字數 1863 閱讀 1749

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

①、按操作劃分: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;

悲觀鎖

樂觀鎖

bdb:支援頁級鎖和表級鎖,預設是頁級鎖

innodb:支援行級鎖和表級鎖,預設是行級鎖

myisam &memory:這兩個儲存引擎都是採用表級鎖

排它鎖(exclusive locck)

排它鎖又叫寫鎖,如果事務t對a加上排它鎖,則其它事務都不能對a加任何型別的鎖。獲准排它鎖的事務既能讀資料,又能寫資料。

用法:select ... for update

共享鎖(share lock)

共享鎖又叫讀鎖,如果事務t對a加上共享鎖,則其它事務只能對a再加共享鎖,不能加其它鎖。獲准共享鎖的事務只能讀資料,不能寫資料。

用法:select ... lock in share mode;

行級鎖:行級鎖分為共享鎖和排它鎖。行級鎖是mysql中鎖定粒度最細的鎖。innodb引擎支援行級鎖和表級鎖,只有在通過索引條件檢索資料的時候,才使用行級鎖,否就使用表級鎖。行級鎖開銷大,加鎖慢,鎖定粒度最小,發生鎖衝突概率最低,併發度最高

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

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

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

MySQL資料庫的鎖機制

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

Mysql資料庫的鎖機制

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

資料庫(七) MySQL鎖機制

資料庫的樂觀鎖和悲觀鎖?mysql 中有哪幾種鎖,列舉一下?mysql中innodb引擎的行鎖是怎麼實現的?mysql 間隙鎖有沒有了解,死鎖有沒有了解,寫一段會造成死鎖的 sql 語句,死鎖發生了如何解決,mysql 有沒有提供什麼機制去解決死鎖 鎖是計算機協調多個程序或執行緒併發訪問某一資源的機...