mysql中的锁的指令_mysql中的锁
MYSQL不同的存儲引擎支持不同的鎖的機制
MyISAM 支持表鎖,InnoDB支持表鎖和行鎖
表鎖,行鎖比較
表鎖:開銷小,加鎖快;不會出現(xiàn)死鎖;鎖定力度大,發(fā)生鎖沖突概率高,并發(fā)度最低
行鎖:開銷大,加鎖慢;會出現(xiàn)死鎖;鎖定粒度小,發(fā)生鎖沖突的概率低,并發(fā)度高
表鎖適合以查詢?yōu)橹?修改較少的情況;行鎖適合大數(shù)量并發(fā)修改和查詢的情況.
MyISAM
1.MyISAM表級鎖的鎖模式
MyISAM的表級鎖有兩種模式:表共享讀鎖(Table Read Lock)和表獨占寫鎖(Table Write Lock)。鎖模式的兼容性:
對MyISAM表的讀操作,不會阻塞其他用戶對同一表的讀請求,但會阻塞對同一表的寫請求;
對MyISAM表的寫操作,則會阻塞其他用戶對同一表的讀和寫操作;
MyISAM表的讀操作與寫操作之間,以及寫操作之間是串行的。當(dāng)一個線程獲得對一個表的寫鎖后,只有持有鎖的線程可以對表進行更新操作。其他線程的讀、寫操作都會等待,直到鎖被釋放為止。
2.如何加表鎖
MyISAM在執(zhí)行查詢語句(SELECT)前,會自動給涉及的所有表加讀鎖,在執(zhí)行更新操作(UPDATE、DELETE、INSERT等)前,會自動給涉及的表加寫鎖,這個過程并不需要用戶干預(yù),因此,用戶一般不需要直接用LOCK TABLE命令給MyISAM表顯式加鎖。
innoDB
innoDB鎖概念
共享鎖:也叫讀鎖,簡稱S鎖,原理:一個事務(wù)獲取了一個數(shù)據(jù)行的共享鎖,其他事務(wù)能獲得該行對應(yīng)的共享鎖,但不能獲得排他鎖,即一個事務(wù)在讀取一個數(shù)據(jù)行的時候,其他事務(wù)也可以讀,但不能對該數(shù)據(jù)行進行增刪改。
排他鎖:也叫寫鎖,簡稱x鎖,原理:一個事務(wù)獲取了一個數(shù)據(jù)行的排他鎖,其他事務(wù)就不能再獲取該行的其他鎖(排他鎖或者共享鎖),即一個事務(wù)在讀取一個數(shù)據(jù)行的時候,其他事務(wù)不能對該數(shù)據(jù)行進行增刪改查。
意向共享鎖,簡稱IS,其作用在于:通知數(shù)據(jù)庫接下來需要施加什么鎖并對表加鎖。如果需要對記錄A加共享鎖,那么此時innodb會先找到這張表,對該表加意向共享鎖之后,再對記錄A添加共享鎖。
意向排他鎖,簡稱IX,其作用在于:通知數(shù)據(jù)庫接下來需要施加什么鎖并對表加鎖。如果需要對記錄A加排他鎖,那么此時innodb會先找到這張表,對該表加意向排他鎖之后,再對記錄A添加共享鎖。
設(shè)置共享鎖和排他鎖
設(shè)置共享鎖:SELECT ... LOCK IN SHARE MODE;
設(shè)置排他鎖:SELECT ... FOR UPDATE;
注意點
對于select 語句,innodb不會加任何鎖,也就是可以多個并發(fā)去進行select的操作,不會有任何的鎖沖突,因為根本沒有鎖。
對于insert,update,delete操作,innodb會自動給涉及到的數(shù)據(jù)加排他鎖,只有查詢select需要我們手動設(shè)置排他鎖。
行鎖的實現(xiàn)方式
InnoDB行鎖是通過給索引上的索引項加鎖來實現(xiàn)的,這一點MySQL與Oracle不同,后者是通過在數(shù)據(jù)塊中對相應(yīng)數(shù)據(jù)行加鎖來實現(xiàn)的。InnoDB這種行鎖實現(xiàn)特點意味著:只有通過索引條件檢索數(shù)據(jù),InnoDB才使用行級鎖,否則,InnoDB將使用表鎖!在實際應(yīng)用中,要特別注意InnoDB行鎖的這一特性,不然的話,可能導(dǎo)致大量的鎖沖突,從而影響并發(fā)性能。
由于MySQL的行鎖是針對索引加的鎖,不是針對記錄加的鎖,所以雖然是訪問不同行的記錄,但是如果是使用相同的索引鍵,是會出現(xiàn)鎖沖突的
當(dāng)表有多個索引的時候,不同的事務(wù)可以使用不同的索引鎖定不同的行,另外,不論是使用主鍵索引、唯一索引或普通索引,InnoDB都會使用行鎖來對數(shù)據(jù)加鎖。如果不同的索引碰巧都落到了同一個行上,那么同樣會阻塞。
即便在條件中使用了索引字段,但是否使用索引來檢索數(shù)據(jù)是由MySQL通過判斷不同執(zhí)行計劃的代價來決定的,如果MySQL認為全表掃描效率更高,比如對一些很小的表,它就不會使用索引,這種情況下InnoDB將使用表鎖,而不是行鎖。因此,在分析鎖沖突時,別忘了檢查SQL的執(zhí)行計劃,以確認是否真正使用了索引。
mysql發(fā)生死鎖的原因
兩個以上的進程session進行資源爭奪造成的互相等待的狀況
解除正在死鎖的狀態(tài)有兩種方法:
第一種:
1.查詢是否鎖表
show OPEN TABLES where In_use > 0;
2.查詢進程(如果您有SUPER權(quán)限,您可以看到所有線程。否則,您只能看到您自己的線程)
show processlist
3.殺死進程id(就是上面命令的id列)
kill id
第二種:
1.查看下在鎖的事務(wù)
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
2.殺死進程id(就是上面命令的trx_mysql_thread_id列)
kill 線程ID
例子:
查出死鎖進程:SHOW PROCESSLIST
殺掉進程 KILL 420821;
其它關(guān)于查看死鎖的命令:
1:查看當(dāng)前的事務(wù)
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
2:查看當(dāng)前鎖定的事務(wù)
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
3:查看當(dāng)前等鎖的事務(wù)
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
https://blog.csdn.net/puhaiyang/article/details/72284702
樂觀鎖和悲觀鎖是一個大的概念
共享鎖(S鎖),排它鎖(X鎖)
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的mysql中的锁的指令_mysql中的锁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php找不到phpmyadmin,php
- 下一篇: mysql自定义排序以及优化like模糊