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