日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql中的锁的指令_mysql中的锁

發(fā)布時間:2024/9/27 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql中的锁的指令_mysql中的锁 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。