在併發訪問情況下,很有可能出現不可重複讀等等讀現象。為了更好的應對高併發,封鎖、時間戳、樂觀併發控制(樂觀鎖)、悲觀併發控制(悲觀鎖)都是併發控制採用的主要技術方式。
鎖分類①、按操作劃分: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資料庫鎖
表鎖 讀鎖會阻塞寫,但是不會阻塞讀操作。而寫鎖則會把讀和寫都阻塞 myisam索引結構 myisam索引用的b tree來儲存資料,myisam索引的指標指向的是鍵值的位址,位址儲存的是資料。b tree的資料域儲存的內容為實際資料的位址,也就是說它的索引和實際的資料是分開的,只不過是用索引指向了實...
MySQL資料庫鎖
mysql鎖分為表級鎖 頁級鎖和行級鎖。innodb 行級鎖 在特殊情況下會公升級為表級鎖,如給沒有加索引的非唯一字段加鎖,或者在普通索引中,使用模糊查詢使索引失效,導致加鎖時,公升級為表鎖 myisam 表級鎖 排他鎖又稱為寫鎖,乙個事務在一行資料加上排他鎖後,其他事務不能再在其上加其他的鎖,也修...
mysql資料鎖 mysql資料庫鎖有哪些
mysql資料庫中的鎖有 1 共享鎖,表示對資料進行讀操作 2 排他鎖,表示對資料進行寫操作 3 行鎖,對一行記錄加鎖,只影響一條記錄 4 意向鎖,為了在乙個事務中揭示下一行將要被請求鎖的型別。mysql資料庫鎖 1 共享鎖 shared lock,也叫s鎖 共享鎖 s 表示對資料進行讀操作。因此多...