Mysql基礎教程 mysql進階

Mysql共享讀鎖



My ISAM表鎖(共享讀鎖)


為什么要有鎖


打個比方,我們到淘寶上買一件商品,商品只有一件庫存,這個時候如果還有另一個人買,那么如何解決是你買到還是另一個人買到的問題? 


0.png


我們先從庫存表中取出物品數量,然后插入訂單,付款后插入付款表信息,然后更新商品數量。在這個過程中,使用鎖可以對有限的資源進行保護,解決隔離和并發的矛盾。 至始至終,我們都在對這個庫存數量進行一個操作,這個庫存數量,當我在這里購買這件商品還剩一件的時候,別人是沒辦法進行購買的,這個時候,我就會對這個庫存數量進行鎖住,這個鎖住就跟我們在現實生活當中,買同一件商品,而恰好這件商品就只剩了一個,那么誰先付錢,這個商家就會認為這件物品是屬于誰的,同樣的,這里面如果我們首先對這個庫存數量點擊立刻購買的話,那么這個庫存數量就已經被鎖住了,這個被鎖住實際上就是用的我們數據庫中的鎖的概念,那么鎖住之后,其他人是不能夠對這張表進行一個更新的。所以,這里實際上就是用了一個鎖的概念。



鎖的概念


鎖實際上是從現實生活當中抽象出來的概念,現實生活中的鎖就是把這個東西鎖住,別人是沒辦法訪問,或者沒辦法開啟它的。那么我們在數據庫中的鎖它是對于某一種資源的用戶訪問的限制,當我們很多用戶在訪問同一個資源的時候,為了保護這個數據的一致性,所謂的數據的一致性就是我們看到的庫存數量為1,當我們購買的時候數量就變成0了,這里面的數量為1的話,別人是沒辦法購買的,因為這個數量1,已經被我鎖住了。這樣就能保證這個鎖的一致性,有效性,所以,這個鎖在我們的數據庫開發當中,或者說并發訪問,所謂的并發訪問就是很多人,或者多個客戶端訪問的時候,它是一個非常重要的因素。


鎖是計算機協調多個進程或線程并發訪問某一資源的機制。在數據庫中,數據也是一種供許多用戶共享的資源。如何保證數據并發訪問的一致性、有效性是所有數據庫必須解決的一個問題,鎖沖突也是影響數據庫并發訪問性能的一個重要因素。從這個角度來說,鎖對數據庫而言顯得尤其重要,也更加復雜。



MySQL鎖概述


相對其他數據庫而言,MySQL的鎖機制比較簡單,其最顯著的特點是不同的存儲引擎支持不同的鎖機制。比如,MyISAM和MEMORY存儲引擎采用的是表級鎖(table-level locking);BDB存儲引擎采用的是頁面鎖(page-level locking),但也支持表級鎖;InnoDB存儲引擎既支持行級鎖(row-level locking),也支持表級鎖,但默認情況下是采用行級鎖。


MySQL這3種鎖的特性可大致歸納如下。開銷、加鎖速度、死鎖、粒度、并發性能。表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高,并發度最低。行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,并發度也最高。頁面鎖:開銷和加鎖時間界于表鎖和行鎖之間;會出現死鎖;鎖定粒度界于表鎖和行鎖之間,并發度一般。僅從鎖的角度來說:表級鎖更適合于以查詢為主,只有少量按索引條件更新數據的應用,如Web應用;而行級鎖則更適合于有大量按索引條件并發更新少量不同數據,同時又有并發查詢的應用,如一些在線事務處理(OLTP)系統。


從上述特點可見,很難籠統地說哪種鎖更好,只能就具體應用的特點來說哪種鎖更合適!



My ISAM表鎖


MySQL的表級鎖有兩種模式:表共享讀鎖(Table Read Lock)和表獨占寫鎖(Table Write Lock)。


MySQL中的表鎖兼容性 。


 1.png


給表加鎖


1)加共享讀鎖 lock table 表名 read。


2)表獨占寫鎖lock table 表名 read。


說明


對MyISAM表的讀操作,不會阻塞其他用戶對同一表的讀請求,但會阻塞對同一表的寫請求;對 MyISAM表的寫操作,則會阻塞其他用戶對同一表的讀和寫操作;MyISAM表的讀操作與寫操作之間,以及寫操作之間是串行的!當一個線程獲得對一個表的寫鎖后,只有持有鎖的線程可以對表進行更新操作。其他線程的讀、寫操作都會等待,直到鎖被釋放為止。


一個session使用LOCK TABLE命令給表f加了讀鎖,這個session可以查詢鎖定表中的記錄,但更新或訪問其他表都會提示錯誤;同時,另外一個session可以查詢表中的記錄,但更新就會出現鎖等待。



示例


加共享讀鎖   


我們應該首先改變一下表的數據類型,這個表的數據類型我們應該采用My ISAM這個類型,當然你也可以直接修改這個表的結構,當然修改這個表的結構由于它有主外鍵的關聯,所以這個效果并不是最好的,最好我們就把這個數據導出來,導出來之后,然后修改如下內容。


2.png


3.png


我們先開一個客戶端。


4.png


選擇數據庫。


5.png


選擇表,要保證ENGINE=MyISAM這個模型。


6.png


先查詢這個表中的數據。


7.png


我們給這張表加一個讀的鎖。


8.png


使用另一個客戶端來連接。


9.png


同樣使用companys這個數據庫。


90.png


由于是另一個客戶端加了一個共享讀鎖,那我們現在來訪問它,發現是可以的,也就是說,即便我們在一個session當中給它加了一個共享讀鎖,那么在這里面,我們訪問的時候還是可以訪問的。


91.png


那我們能不能在另一個session當中給它更新呢?這里已經更新了,但是沒顯示結果。這是因為給它加了一個共享讀鎖,正是給它加了個共享讀鎖以后,其他session它是沒辦法更新的,但是它可以做一個查詢操作。


92.png


我們給它解鎖。


93.png


一旦解鎖,就可以更新。


94.png


再另一個客戶端加鎖。


95.png


在一個session當中插入如下命令。


96.png


我們看表有什么等待,輸入如下命令。


97.png


我們來看Table_locks_waited這個值,如果這個值比較高的話,說明我們的這個表級鎖在應用的程度比較高,這實際上是對我們的數據庫是有問題的。


98.png


我們給它解鎖。


99.png


解鎖之后,我們剛剛插入的信息就已經成功了。


990.png


如果一個客戶端采用共享讀鎖的話,那其他的客戶端只能去讀,而不能去寫這個數據。



【本文由麥子學院獨家原創,轉載請注明出處并保留原文鏈接】

logo
? 2012-2016 www.jvbprd.live
蜀ICP備13014270號-4 Version 5.0.0 release20160127

免費領取價值1888元求職寶典!

客服熱線 400-862-8862

回到頂部

彩票安徽25选5 安卓手机捕鱼达人2修改金币教程 汽贸公司赚钱吗 在苏州做什么行业赚钱 欢乐麻将好友房怎么开 杭州麻将技巧顺口溜 荒野大镖客2赚钱 零本金赚钱 4399小游戏捕鸟达人 短网址赚钱是什么 彩立方彩票游戏 影视后期工作室赚钱吗 宁夏麻将划水作弊器 王者荣耀帮人代打赚钱 问道手游挂机那个赚钱 星辉国际苹果 自媒体有哪些赚钱