1.引入
2.行鎖的特點
行鎖偏向於innodb儲存引擎,開銷大,加鎖慢;會出現死鎖;鎖定的粒度最小,發生鎖衝突的概率最小,併發度也最高。
3.行鎖的乙個基本案例
(1).建立測試資料庫表boys
drop table if exists `boys`;
create table `boys` (
`id` int(11) not null auto_increment,
`boyname` varchar(20) default null,
`usercp` int(11) default null,
primary key (`id`)
) engine=innodb auto_increment=1 default charset=utf8;
//注意,這裡面的儲存引擎我們使用的是innodb
新增資料並檢視內容:
給字段boyname和usercp分別建立索引
(2).關閉資料的自動提交,測試的倆個會話都關閉自動提交
set autocommit = 0;
注意,這裡面關閉自動提交以後各個會話中只能夠做到讀自己所提交的資料!!,如下:
(3).倆個session都進行修改操作
a:對同一行資料進行修改操作,修改boyname值對於id為1的這一行
會話1進行資料的修改操作,操作已執行。
會話2進行資料的修改操作,操作阻塞,會話1提交以後,會話2立刻執行提交
最後的資料儲存結果以最後提交的資料為準:
b:對不同行資料進行修改操作
會話1修改id為2的行
會話2修改id為3的行
倆個會話提交以後的結果就是各自提交的資料內容,如下:
4.索引失效致使行鎖變為表鎖
(1).為了方便我們的操作演示,我們呢把usercp欄位的值進行乙個更改,結果如下:
(2).通過倆個不同的會話進行不同的資料操作
會話1對usercp = 100的記錄進行更改操作
會話2對usercp = 200的記錄進行更改操作
我們在索引的內容的時候和大家說過,字串型別的值必須要加引號,那麼當我們手誤把引號去掉以後是乙個什麼情況?
會話1我們還是修改boyname = 諸葛亮 的記錄
我們這裡就會直接報錯,它認為是把值當做了乙個新的字段列。
如果執行成功,那麼它就會對其他的會話連線進行阻塞,這其實是乙個很隱晦的問題,也是乙個不容易察覺的問題。
也就是它把行鎖直接變成了表鎖。
5.如何鎖定一行(其實就是如何多個會話同時操作一行資料時候針對這一行資料進行乙個鎖定)
會話1操作如下。
會話2在操作id = 1的字段就會阻塞
6.行鎖總結
(1).分析行鎖定
可以使用innodb_row_lock狀態變數來分析系統上的行鎖的爭奪情況。使用如下的指令:
show status like 'innodb_row_lock%';
結果以及引數說明如下:
其中比較重要的是我們需要看一下引數2,引數3,引數5,其中尤其是等待次數,當等待的次數比較高的時候,我們就需要分析系統中為什麼會有如此多的的等待,然後根據分析的結果制定優化計畫。
(2).行鎖優化建議
1.盡可能的讓所有資料檢索都通過索引來完成,避免無所有行鎖公升級為表鎖。
2.合理的設計索引,盡量縮小鎖的範圍。
3.盡可能較少檢索條件,避免間隙鎖的發生。
4.盡量控制事務大小,減少鎖定資源量和時間長度。
5.盡可能低級別事務隔離。
mysql鎖機制之行級鎖
鎖是在執行多執行緒時用於強行限定資源訪問的同步機制,資料庫鎖根據鎖的粒度可分為行級鎖,表級鎖和頁級鎖 行級鎖 行級鎖是mysql中粒度最細的一種鎖機制,表示只對當前所操作的行進行加鎖,行級鎖發生衝突的概率很低,其粒度最小,但是加鎖的代價最大。行級鎖分為共享鎖和排他鎖。特點 開銷大,加鎖慢,會出現死鎖...
MySQL mysql中的鎖機制
mysql的鎖機制不同的儲存引擎支援不同的鎖機制,分為表級鎖 行級鎖 頁面鎖。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row lev...
MySQL MySQL鎖機制之讀鎖操作
1.引入 我們在之前的執行緒中,已經初步接觸到了鎖的一些相關的內容。那麼當時的我們使用售票為例子,列舉了在只剩一張票的時候電腦程式在實現購票中不加鎖出現的各種問題。當我們再執行緒中加了鎖以後,就可以保證計算機對這乙個資料的爭搶乙個有序的處理。那麼在mysql資料庫中。我們同樣需要學習資料庫的鎖機制來...