MySQL資料庫的鎖機制

2021-08-28 20:18:52 字數 1938 閱讀 6839

原文首發於:

本文出自

rebornchang的部落格

拋開資料庫引擎說資料庫鎖機制的都是流氓…

引言:mysql資料庫的引擎分為三種,myisam(isam)、innodb以及memory,具體的引擎型別效能比較可以baidu到,這裡就不多說了,本文中所說的鎖機制基於innodb引擎,那為啥說基於innodb引擎說鎖呢?因為innodb支援事務,支援行鎖和表鎖用的比較多,myisam不支援事務,只支援表鎖。innodb 與 myisam 的最大不同有兩點:一是 innodb 支援事務;二是 innodb 採用了行級鎖。也就是你需要修改哪行,就可以只鎖定哪行。

mysql 在5.5之前預設使用 myisam 儲存引擎,之後使用 innodb 。檢視當前儲存引擎:show variables like 『%storage_engine%』;

事務是一條或多條資料庫操作語句的組合,具備acid,4個特點。

籠統的說,可能會產生髒讀,幻讀,丟失更新,不可重複讀這幾種。對這幾種併發會產生的問題,可以baidu,點進去就ok啦。

在進行資料庫資料的讀寫(cuid)時,當多事務爭取乙個資源時,有可能導致資料不一致,這個時候需要一種機制限制,並且將資料訪問順序化,用來保證資料庫資料的一致性。當多個事務同時讀取乙個物件的時候,不會有衝突。同時進行讀和寫,或者同時寫會產生衝突(對於update、delete和insert語句,innodb會自動給涉及資料集加排他鎖(x);對於普通select語句,innodb不會加任何鎖,因為,資料庫的增刪改操作預設都會加排他鎖,而查詢不會加任何鎖。事務可以通過以下語句顯示給記錄集加共享鎖或排他鎖)。所以,為了保證資料的一致性以及提高資料庫的併發效率,mysql中提供了以下幾種鎖的機制:

先說下這兩種鎖的sql結構:

select … lock in share mode走的是is鎖(意向共享鎖),即在符合條件的rows上都加了共享鎖,這樣的話,其他人可以讀取這些記錄,也可以繼續新增is鎖,但是無法修改這些記錄直到你這個加鎖的過程執行完成(完成的情況有:事務的提交,事務的回滾,否則直接鎖等待超時)。

select … lock in share mode的應用場景適合於兩張表存在關係時的寫操作,比如:現在有兩張表,一張是child表,一張是parent表,假設child表的某一列child_id對映到parent表的c_child_id。從業務角度講,如果直接insert一條child_id=666記錄到child表是存在風險的,因為剛insert的時候可能在parent表裡刪除了這條c_child_id=666的記錄,那麼業務資料就會存在資料不一致的風險。正確的方法是:在插入時執行select * from parent where c_child_id=666 lock in share mode,鎖定了parent表的這條記錄,然後執行insert into child(child_id) values (666),這樣就不會存在這種問題了。

排他鎖表示對資料進行寫操作。如果乙個事務對物件加了排他鎖,其他事務就不能再給它加任何鎖了。

select * from table_name where … for update;

系統計算一種商品的剩餘量,在產生訂單之前需要確認商品數量》=1,產生訂單之後應該將商品數量減1。

1 :select p.amount from product p where product_name=『xx』;

2 :update product set amount=amount-1 where product_name=『xx』;

顯然1的做法有問題,因為如果1查詢出amount為1,但是這時正好其他session也買了該商品並產生了訂單,那麼amount就變成了0,那麼這時第二步再執行就有問題。那麼採用lock in share mode可行嗎,也是不合理的,因為兩個session同時鎖定該行記錄時,這時兩個session再update時必然會產生死鎖導致事務回滾。

具體的鎖機制baidu上有很多的,可以自行前去搜尋學習,這裡講的比較籠統,僅供參考,over!

Mysql資料庫的鎖機制

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

MySQL資料庫的鎖機制

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

資料庫(七) MySQL鎖機制

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