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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447918.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447918.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447918.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言的整型溢出問題

整型溢出有點老生常談了&#xff0c;bla, bla, bla… 但似乎沒有引起多少人的重視。整型溢出會有可能導致緩沖區溢出&#xff0c;緩沖區溢出會導致各種黑客攻擊&#xff0c;比如最近OpenSSL的heartbleed事件&#xff0c;就是一個buffer overread的事件。在這里寫下這篇文章&…

石牌村中的美好 ...

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 看了下我這些天的吃的&#xff0c;好像天天是盒飯 ... 不過 2 葷 2 素 11 元&#xff0c;大概是城中村才會這么便宜吧 。 村里有很多…

警惕 十種短命的生活方式

“忙忙忙&#xff0c;忙到白了頭”。忙碌的白領階層在“金錢”與“健康”的物物交換中&#xff0c;損失掉的是什么呢? 究竟是什么在日復一日地蠶食白領們的生命? 危險方式1&#xff1a;極度缺乏體育鍛煉 在932名被調查者中&#xff0c;只有96人每周都固定時間鍛煉&#xff…

Thymeleaf 簡介、教程

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Thymeleaf是一個適用于Web和獨立環境的現代服務器端Java模板引擎。 Thymeleaf的主要目標是為您的開發工作流程帶來優雅的自然模板 - 可…

HDU 6682 Make Rounddog Happy

題意&#xff1a;給你一個集合&#xff0c;求它的所有子集的子集和中數字4出現了多少次 例如 4 4 4 44 44 中4(1)&#xff0c;4(2)&#xff0c;44(3)&#xff0c;44(4)&#xff0c;48(1,3)&#xff0c;48(1,4)&#xff0c;48(2,3)&#xff0c;48(2,4)&#xff0c;總共有10個數字…

如期而至,GCC 4.9.0正式版發布!

摘要&#xff1a;GCC是一套由GNU開發的編程語言編譯器。近日&#xff0c;GCC 4.9.0發布&#xff0c;主要新特性包括&#xff1a;提升了C11和C14特性&#xff1b;診斷信息支持彩色顯示&#xff1b;移除mudflap運行時檢查器等。 如期而至&#xff0c;GCC 4.9.0發布&#xff0c;該…

2.9 go mod 之本地倉庫搭建

wikihttps://github.com/golang/go/wiki/Modules#how-to-prepare-for-a-release參考https://blog.csdn.net/benben_2015/article/details/82227338 go mod 之本地倉庫搭建----------------------------------------------------------------------------------------將當前項目…

《 追風箏的人 》:“ 為你,千千萬萬遍 ” ...

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 剛來研發中心的時候&#xff0c;在我的新位置上發現了一本書&#xff0c;問后得知是前同事留下的&#xff0c;已無主 。 我就收下了。一…

機器學習入門階段程序員易犯的5個錯誤

本文由 伯樂在線 - toolate 翻譯自 machine learning mastery。歡迎加入 技術翻譯小組。轉載請參見文章末尾處的要求。怎樣進入機器學習領域沒有定式。我們的學習方式都有些許不同&#xff0c;學習的目標也因人而異。 但一個共同的目標就是要能盡快上手。如果這也是你的目標&…

解決: Vue 項目本地運行 run 與服務器上 build 樣式不一致,build 后樣式不生效

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 PS&#xff1a;本人遇到這個問題是用文中最后一句話解決&#xff1a;" 在組件的樣式中記得添加 scoped "。 在Vue項目開發過程…

【付出總有回報】廣州廣汕公路科目三路考通過!小結供大家參考

首先&#xff0c;我的路考小結只供大家參考&#xff0c;大家覺得能用就當提個醒&#xff0c;不能用就權當頂貼積分捧人場啦哈哈祝各位都能順利過關&#xff01;考前心里和技術準備&#xff1a;我是13年6月底才考完科目二“五項必考”。7月8日才考完長途&#xff0c;可這時候我的…

解決:vue 用 axios 發送請求,每次都會發送兩次請求

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我的解決方法是后端加一個過濾器&#xff1a; package gentle.filter;import javax.servlet.*; import javax.servlet.annotation.WebF…

廣州科目三考試 不得不看的十條提醒(圖)

導讀&#xff1a; 考試科目三時考試常會有點小緊張。經常會有考生因為緊張犯了些小錯誤而被pass掉。如何來應對呢&#xff1f;首先是放松心態&#xff0c;這點其實大家都明白&#xff0c;只是做不到。有人一到考試的時候就緊張&#xff0c;完全思維混亂&#xff0c;動作僵硬。建…

HDU 6706 huntian oy

題意 求以下式子的值&#xff0c;T組數據各個字母滿足1 ≤ n , a , b ≤109 &#xff0c;a,b互質 思路&#xff1a; 卡常毒瘤題&#xff0c;出題人時限卡的非常緊&#xff0c;考場上推出來又T又WA 1 #include<bits/stdc.h>2 using namespace std;3 typedef long long ll;…

linux 查看空間(內存、磁盤、文件目錄、分區)的幾個命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. free free命令用于顯示內存狀態。 free指令會顯示內存的使用情況&#xff0c;包括實體內存&#xff0c;虛擬的交換文件內存&#x…

Ubuntu安裝LNMP

安裝Nginx使用 apt-get install nginx 就能自動安裝 Nginx。 為了確保獲得最新的Nginx&#xff0c;可以先使用 apt-get update 命令更新源列表。 安裝好之后&#xff0c;使用 dpkg -S nginx 命令來搜索 nginx相關文件。 可以從命令顯示結果看出 Nginx默認的安裝位置是/etc/ngin…

廣州學車科目三路考操作步驟要領

廣州學車&#xff0c;科目三路考操作步驟是關鍵&#xff0c;許多朋友明明會開車&#xff0c;卻因為一些步驟上的小疏忽而不得到不補考&#xff0c;今天總結出這個廣州學車科目三路考操作步驟要領&#xff0c;希望對大家有幫助&#xff1a; 廣州學車&#xff0c;科目三路考操作步…

如何和何時使用 CSS 的權重設置 !important (建議:永不使用!)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 特別聲明&#xff1a;此篇文章由David根據Louis Lazaris的英文文章原名《!important CSS Declarations: How and When to Use Them》進行…

獨立組件開發打包

組件單獨打包 先在src下面新建hymenucsg.js文件 然后在build下的webpack.base.conf.dist.js里面 設置入口文件hymenucsg: ./src/hymenucsg.js,//csg 最后運行打包命令&#xff1a;npm run dist:dev 之后會在dist下面生成組件的js和css文件 使用&#xff1a; html中引入js和css …

廣州科目三電子考需注意哪些問題?

廣州駕考科目三從4月1日起開始試行電子評判與人工評判相結合的新制度&#xff0c;即電子路考&#xff0c;多數學員對新制度表示不適應&#xff0c;那么&#xff0c;科目三電子路考需要注意哪些問題? 從4月1日開始&#xff0c;科目三考試將試行計算機輔助與人工評判相結合的制度…