最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql中Innodb 行鎖實現(xiàn)原理

 更新時間:2024年10月21日 10:25:26   作者:程序猿進階  
InnoDB的行鎖是通過索引項加鎖實現(xiàn)的,分為使用索引和非索引字段檢索的情況,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、Innodb行鎖的實現(xiàn)

【1】Innodb的行鎖是通過給索引的索引項加鎖來實現(xiàn)的

【2】Innodb按照輔助索引進行數(shù)據(jù)操作時,輔助索引和主鍵索引都將鎖定指定的索引項

【3】通過索引進行數(shù)據(jù)檢索時,Innodb才使用行級鎖,否則Innodb將使用表鎖

二、場景分析

環(huán)境: 創(chuàng)建一張表,ID為主鍵,Name為普通字段。下面通過實際場景進行說明。

【1】使用主鍵ID來進行數(shù)據(jù)檢索時,其余行仍然可以操作。

session1session2
mysql>set autocommit=0;
Query OK,0 rows affected(0.00sec)
mysql>set autocommit=0;
Query OK,0 rows affected(0.00sec)
mysql> select * from test_lock wehre id = 1 for update;
±-----±-----+
| id | name  |
| 1  | hua zi |
1 row in set(0.00sec)
mysql> select * from test_lock wehre id = 2 for update;
±-----±-----+
| id | name  |
| 2  | guo zi |
1 row in set(0.00sec)
【2】用非索引的字段來進行數(shù)據(jù)檢索時,此時會升級為表鎖,其余列就不能操作。
session1session2
--------
mysql>set autocommit=0;
Query OK,0 rows affected(0.00sec)
mysql>set autocommit=0;
Query OK,0 rows affected(0.00sec)
mysql> select * from test_lock wehre name = ‘hua zi’ for update;
±-----±-----+
| id | name  |
| 1  | hua zi |
1 row in set(0.00sec)
mysql> select * from test_lock wehre name = ‘guo zi’ for update;
等待
【3】由于MySQL的行鎖是針對索引加的鎖,不是針對記錄加的鎖,所以雖然是訪問不同行的記錄,但是如果是使用相同的索引鍵,是會出現(xiàn)鎖沖突的。應用設計的時候要注意這一點。雖然 session_2和session_1訪問的是不同的記錄,但因為使用了相同的索引,所以需要等待鎖。
session1session2
--------
mysql>set autocommit=0;
Query OK,0 rows affected(0.00sec)
mysql>set autocommit=0;
Query OK,0 rows affected(0.00sec)
mysql> select * from test_lock wehre id = 1 and name = ‘hua zi’ for update;
±-----±-----+
|  id | name  |
|  1  | hua zi |
1 row in set(0.00sec)
mysql> select * from test_lock wehre id = 1 and name = ‘guo zi’ for update;
等待
【4】當表有多個索引的時候,不同的事務可以使用不同的索引鎖定不同的行,另外,不論是使用主鍵索引、唯一索引或普通索引,InnoDB都會使用行鎖來對數(shù)據(jù)加鎖。
session1session2
--------
mysql>set autocommit=0;
Query OK,0 rows affected(0.00sec)
mysql>set autocommit=0;
Query OK,0 rows affected(0.00sec)
mysql> select * from test_lock wehre id = 1 for update;
±-----±-----+
| id | name  |
| 1  | hua zi |
1 row in set(0.00sec)
mysql> select * from test_lock wehre name = ‘guo zi’ for update;
±-----±-----+
| id | name  |
| 2  | guo zi |
1 row in set(0.00sec)
mysql> select * from test_lock wehre name = ‘hua zi’ for update;
等待

三、特殊場景

即便在條件中使用了索引字段,但是否使用索引來檢索數(shù)據(jù)是由MySQL通過判斷不同執(zhí)行計劃的代價來決定的,如果MySQL認為全表掃描效率更高,比如對一些很小的表,它就不會使用索引,這種情況下InnoDB將使用表鎖,而不是行鎖。因此,在分析鎖沖突時,別忘了檢查SQL的執(zhí)行計劃,以確認是否真正使用了索引。

在下面的例子中,檢索值的數(shù)據(jù)類型與索引字段不同,雖然MySQL能夠進行數(shù)據(jù)類型轉(zhuǎn)換,但卻不會使用索引,從而導致InnoDB使用表鎖。通過用explain檢查兩條SQL的執(zhí)行計劃,我們可以清楚地看到了這一點。

mysql> alter table test_lock add index name(name);
Query OK, 4 rows affected (8.06 sec)
Records: 4  Duplicates: 0  Warnings: 0
mysql> explain select * from test_lock where name = 1 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test_lock
type: ALL
possible_keys: name
key: NULL
key_len: NULL
ref: NULL
rows: 4
Extra: Using where
1 row in set (0.00 sec)
mysql> explain select * from test_lock where name = '1' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test_lock
type: ref
possible_keys: name
key: name
key_len: 23
ref: const
rows: 1
Extra: Using where
1 row in set (0.00 sec)

到此這篇關(guān)于mysql中Innodb 行鎖實現(xiàn)原理的文章就介紹到這了,更多相關(guān)mysql Innodb 行鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

您可能感興趣的文章:

相關(guān)文章

最新評論

凤庆县| 鄂托克前旗| 胶南市| 惠水县| 红桥区| 隆尧县| 金塔县| 五原县| 太湖县| 沙河市| 陆良县| 陕西省| 红河县| 开原市| 吉安市| 巴彦淖尔市| 电白县| 阿拉善左旗| 堆龙德庆县| 常宁市| 兴国县| 安福县| 蒙阴县| 抚宁县| 任丘市| 通州市| 彰武县| 阿坝县| 志丹县| 隆化县| 凤冈县| 阳信县| 新干县| 高青县| 泸水县| 明星| 彭水| 喀喇沁旗| 丰顺县| 集安市| 两当县|