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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

my40_MySQL锁概述之意向锁

發布時間:2023/12/18 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 my40_MySQL锁概述之意向锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?本文在鎖概述的基礎上,通常實驗舉例,詳細地介紹了意向鎖的原理。

鎖范圍?

全局鎖(global lock)
表鎖(table lock)
行鎖 (row lock)

ROW LOCK的粒度
LOCK_REC_NOG_GAP, record lock with out gap lock
LOCK_GAP, gap lock
LOCK_ORDINARY , next key lock = record lock + gap lock

鎖等待與死鎖
鎖等待 事務提交或等待超時;死鎖,是一個死循環。死鎖中必有鎖等待。

表鎖
5.5以后在server層實現表鎖
innodb中有IS/IX表級鎖,以及自增鎖(auto-inc)

讀鎖
加讀鎖后,只能對表讀,不能對表寫;允許多個會話同時讀;其他會話可以加共享讀鎖
lock table?table_name read

寫鎖
lock table table_name write
持有鎖的會話可寫可讀
其他會話訪問表或請求加鎖都會被阻塞,直到鎖釋放

釋放鎖
unlock tables;
lock table 鎖不能相互嵌套,一個事務開始就意味著另外一個事務結束
顯式開啟一個事務,因為事務中不能支持表鎖,所以事務開始則表鎖斷開
Kill或連接斷開

innodb鎖
默認為行鎖
在索引上加鎖來實現行鎖
如果沒有索引,那么升級為全表記錄鎖,最終效果等同于表鎖;但表鎖只需要在根節點上加鎖,而不是對所有記錄加鎖,所以代價要小一些

?

鎖類型
共享鎖
排他鎖/獨占鎖
意向鎖,innodb特有,加在表級別上的鎖


共享鎖與獨占鎖均用于事務當中,隨事務的結束而解除。

共享鎖(share lock)
又稱讀鎖,讀取操作創建的鎖。
一旦上鎖,任何事務(包括當前事務)無法對其修改,其他事務可以并發讀取數據,也可在對此數據再加共享鎖
語法:SELECT ... LOCK IN SHARE MODE;


排他鎖(exclusive lock)
又稱寫鎖,如果事務對數據A加上排他鎖后,則其他事務不可并發讀取數據,也不能再對A加任何類型的鎖。獲得排他鎖的事務既能讀數據,又能修改數據。
語法:SELECT ... FOR UPDATE
這里的“其他事務不可并發讀取數據”,指的是不可以加共享鎖,即不可以以lock in share mode的方式讀取數據,比如

會話一

mysql> select * from test for update; +----+------+------+ | id | v1 | v2 | +----+------+------+ | 1 | 1 | 0 | | 2 | 3 | 1 | | 3 | 4 | 2 | | 5 | 5 | 3 | | 7 | 7 | 4 | | 10 | 9 | 5 | +----+------+------+ 6 rows in set (0.00 sec)

會話二:

mysql> select * from test lock in share mode; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

直接查詢完全可以

mysql> select * from test; +----+------+------+ | id | v1 | v2 | +----+------+------+ | 1 | 1 | 0 | | 2 | 3 | 1 | | 3 | 4 | 2 | | 5 | 5 | 3 | | 7 | 7 | 4 | | 10 | 9 | 5 | +----+------+------+ 6 rows in set (0.00 sec)

這是因為直接查詢走的是一致性快照讀,讀的是MVCC版本控制下的快照,不加鎖;換句話說,排他鎖排斥的“讀”,是指S鎖下的讀,或者說是當前讀

意向鎖
InnoDB的表級鎖,其設計目的主要是為了在一個事務中揭示下一步將要被請求的鎖的類型。
InnoDB中的兩個表鎖:
意向共享鎖(IS):表示事務準備給數據行加入共享鎖,也就是說一個數據行加共享鎖前必須先取得該表的IS鎖
意向排他鎖(IX):類似上面,表示事務準備給數據行加入排他鎖,說明事務在一個數據行加排他鎖前必須先取得該表的IX鎖。
意向鎖是InnoDB自動加的,不需要用戶干預。

意向鎖是表級鎖
事務要獲取表A某些行的S鎖必須要獲取表A的IS鎖
事務要獲取表A某些行的X鎖必須要獲取表A的IX鎖


會話一鎖定了全表

?會話二,結果集為空時不加鎖

?

意向鎖的目的在于提高innodb性能,會話一鎖定的是全表,那么會話二一看全表已被鎖定,則不再去看每行是否鎖定
會話二先判斷表上有沒有表鎖,如果沒有表級鎖,則開始判斷有沒有行級鎖

會話一:不鎖定全表的S鎖

?會話二:立即執行,不被鎖;v1上有索引

?

v1字段上有索引,v2字段上沒有索引;有索引時,優先按有索引的規則來,當字段上沒有索引時,S鎖,X鎖走意向鎖的邏輯;
會話一

mysql> begin;select * from test where v1 >4 lock in share mode; Query OK, 0 rows affected (0.00 sec)+----+------+------+ | id | v1 | v2 | +----+------+------+ | 5 | 5 | 3 | | 7 | 7 | 4 | | 10 | 9 | 5 | +----+------+------+ 3 rows in set (0.00 sec)mysql> rollback; Query OK, 0 rows affected (0.00 sec)mysql> begin;select * from test where v2 >4 lock in share mode; Query OK, 0 rows affected (0.00 sec)+----+------+------+ | id | v1 | v2 | +----+------+------+ | 10 | 9 | 5 | +----+------+------+ 1 row in set (0.00 sec)

會話二:

mysql> begin;select * from test where v1 < 2 for update; Query OK, 0 rows affected (0.00 sec)+----+------+------+ | id | v1 | v2 | +----+------+------+ | 1 | 1 | 0 | +----+------+------+ 1 row in set (0.00 sec)mysql> rollback; Query OK, 0 rows affected (0.00 sec)mysql> mysql> mysql> begin;select * from test where v2 < 2 for update; Query OK, 0 rows affected (0.00 sec)ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction mysql>

如果不是S鎖,而是快照讀的話,不會走意向鎖的邏輯,因為快照讀不加鎖(不管是RC還是RR隔離級別);

會話一

mysql> begin;select * from test where v2 >4; Query OK, 0 rows affected (0.00 sec)+----+------+------+ | id | v1 | v2 | +----+------+------+ | 10 | 9 | 5 | +----+------+------+ 1 row in set (0.00 sec)

會話二:立即執行,沒有鎖等待

mysql> begin;select * from test where v2 < 2 for update; Query OK, 0 rows affected (0.00 sec)+----+------+------+ | id | v1 | v2 | +----+------+------+ | 1 | 1 | 0 | | 2 | 3 | 1 | +----+------+------+ 2 rows in set (0.00 sec)

?

對于無索引的情況,更新任何一條記錄,都會對該表加鎖,這時意向鎖將非常有用;但這個場景有個例外-->“半一致性讀”

半一致性讀的條件:
5.7及以下版本時,需要innodb_locks_unsafe_for_binlog 開啟或事務隔離級別為RC,語言類型為update
8.0版本,語言類型為update,事務隔離級別為RC;innodb_locks_unsafe_for_binlog 參數被廢棄。

8.0中半一致性讀測試
mysql> set global transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)

會話一

mysql> begin;select * from test where v2 >4 for update; Query OK, 0 rows affected (0.00 sec)+----+------+------+ | id | v1 | v2 | +----+------+------+ | 10 | 9 | 5 | +----+------+------+ 1 row in set (8.77 sec)

會話二:顯式開始一個事務被阻塞,直接使用update語句不被阻塞;注意v2字段上無索引

mysql> begin;select * from test where v2 < 2 for update; Query OK, 0 rows affected (0.00 sec)^C^C -- query aborted ERROR 1317 (70100): Query execution was interruptedmysql> select * from test; +----+------+------+ | id | v1 | v2 | +----+------+------+ | 1 | 1 | 0 | | 2 | 3 | 1 | | 3 | 4 | 2 | | 5 | 5 | 3 | | 7 | 7 | 4 | | 10 | 9 | 5 | +----+------+------+ 6 rows in set (0.00 sec)mysql> update test set v2 = 1 where v2 < 2; Query OK, 1 row affected (0.00 sec) Rows matched: 2 Changed: 1 Warnings: 0mysql> exit

8.0的RR隔離級別
mysql> set global transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)
會話一:X鎖測試

mysql> begin;select * from test where v2 >4 for update; Query OK, 0 rows affected (0.00 sec)+----+------+------+ | id | v1 | v2 | +----+------+------+ | 10 | 9 | 5 | +----+------+------+ 1 row in set (0.00 sec)

?

會話二:

mysql> update test set v2 = 1 where v2 < 2; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

8.0中半一致讀的條件:RC及以下隔離級別,update語句

對于RR隔離級別,無索引的情況下,S鎖,X鎖,走意向鎖的邏輯

會話一:S鎖測試

mysql> begin;select * from test where v2 >4 lock in share mode; Query OK, 0 rows affected (0.00 sec)+----+------+------+ | id | v1 | v2 | +----+------+------+ | 10 | 9 | 5 | +----+------+------+ 1 row in set (0.00 sec)

會話二:

mysql> update test set v2 = 1 where v2 < 2; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

所以意向鎖的關鍵在于是否是S鎖與X鎖;如果是RC隔離級別,需要注意一下“半一致性讀”
S鎖會先有全表上加IS,X鎖會先在全表上加IX;IS與IX互斥,IX與IX及IS互斥;

對于經常使用的RR隔離級別,對于無索引字段,意向鎖減少了后來鎖判斷行記錄上是否有鎖的時間

?

轉載于:https://www.cnblogs.com/perfei/p/11367804.html

總結

以上是生活随笔為你收集整理的my40_MySQL锁概述之意向锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 69国产成人精品二区 | 亚洲人高潮女人毛茸茸 | 欧美在线高清 | 国产欧美成人 | 欧美日韩性 | 午夜小视频免费 | 性无码专区无码 | 五月婷婷色丁香 | 久久国产乱子伦免费精品 | 被绑在床强摁做开腿呻吟 | 可以在线看的av | 国产成人麻豆精品午夜在线 | a在线视频| www.com毛片| 美女91网站 | 在线看片亚洲 | 色多多网站| 国产99在线 | 亚洲 | 婷婷色婷婷 | 妖精视频在线观看 | 三级福利视频 | 狠狠爱夜夜爱 | 欧美在线一二三 | 特黄大片又粗又大又暴 | 国产美女精品一区二区三区 | 欧美激情一二三区 | aa一级视频 | 成年人在线观看视频 | www国产精品视频 | 97狠狠干 | ⅹxxxxhd亚洲日本hd老师 | 国产免费色视频 | 国产精品日韩欧美一区二区三区 | 一区二区在线视频播放 | 日韩网红少妇无码视频香港 | 看全色黄大色黄大片女一次牛 | 亚洲天堂91 | 在线观看国产免费视频 | 国产天堂久久 | 中国老头同性xxxxx | 欧美黄色精品 | 奇米狠狠 | 成人gav| 天天躁夜夜躁 | chinese中国性按摩hd | 国产精品无码久久av | 国产成人在线播放 | 国产视频第一页 | 懂爱av | 久久综合第一页 | 国产又粗又猛又黄又爽视频 | 九九九九九伊人 | 亚洲影院中文字幕 | 人妻熟女一区二区aⅴ水野 91在线观看视频 | 香蕉小视频 | 裸体美女免费视频网站 | 国产成人自拍视频在线 | 日韩高清在线观看一区 | 国产视频麻豆 | 亚洲国产综合一区 | 视频免费观看在线 | 男人捅爽女人 | 日韩成人在线免费视频 | 成人做爰免费视频免费看 | 成人黄色免费看 | 人人干干 | 国产色自拍 | 国产精品免费一区二区三区都可以 | 欧美性受xxxxxx黑人xyx性爽 | jizzjizz在线 | 中年夫妇啪啪高潮 | 720url在线观看免费版 | а√天堂资源官网在线资源 | 波多野吉衣一二三区乱码 | 天堂在线观看av | 成人日韩在线 | 国产精品久久久久久久久 | 福利影院在线观看 | 亚洲一区二区电影 | 日本888xxxx| 日韩污污 | 婚后打屁股高h1v1调教 | 在线99视频 | 久久久精品日韩 | www黄色在线观看 | 日日天天干 | 2023毛片 | 黄色网址最新 | 欧美另类videossexo高潮 | 美女性生活视频 | 杏导航aⅴ福利网站 | 欧美一级一区 | 久久亚洲伊人 | 美女毛片 | 欧美成人午夜视频 | 国产三级av在线 | 欧美一区永久视频免费观看 | 四虎永久在线精品免费网址 | 97色干|