欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

【1】Innodb的行鎖是通過(guò)給索引的索引項(xiàng)加鎖來(lái)實(shí)現(xiàn)的

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

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

二、場(chǎng)景分析

環(huán)境: 創(chuàng)建一張表,ID為主鍵,Name為普通字段。下面通過(guò)實(shí)際場(chǎng)景進(jìn)行說(shuō)明。

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

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】用非索引的字段來(lái)進(jìn)行數(shù)據(jù)檢索時(shí),此時(shí)會(huì)升級(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的行鎖是針對(duì)索引加的鎖,不是針對(duì)記錄加的鎖,所以雖然是訪問(wèn)不同行的記錄,但是如果是使用相同的索引鍵,是會(huì)出現(xiàn)鎖沖突的。應(yīng)用設(shè)計(jì)的時(shí)候要注意這一點(diǎn)。雖然 session_2和session_1訪問(wèn)的是不同的記錄,但因?yàn)槭褂昧讼嗤乃饕孕枰却i。
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】當(dāng)表有多個(gè)索引的時(shí)候,不同的事務(wù)可以使用不同的索引鎖定不同的行,另外,不論是使用主鍵索引、唯一索引或普通索引,InnoDB都會(huì)使用行鎖來(lái)對(duì)數(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;
等待

三、特殊場(chǎng)景

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

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

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 行鎖實(shí)現(xiàn)原理的文章就介紹到這了,更多相關(guān)mysql Innodb 行鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • mysql事務(wù)詳細(xì)介紹

    mysql事務(wù)詳細(xì)介紹

    大家好,本篇文章主要講的是mysql事務(wù)詳細(xì)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽<BR>
    2021-12-12
  • MySQL數(shù)據(jù)表?yè)p壞的正確修復(fù)方案

    MySQL數(shù)據(jù)表?yè)p壞的正確修復(fù)方案

    修復(fù)以損壞的MySQL數(shù)據(jù)表的實(shí)際操作在實(shí)際中是我們經(jīng)常用到的,以下的文章主要是介紹正確修復(fù)以損壞的MySQL數(shù)據(jù)表的實(shí)際操作步驟,以下就是正文的介紹,希望會(huì)給你帶來(lái)一些幫助在此方面。
    2011-01-01
  • 基于JPQL實(shí)現(xiàn)純SQL語(yǔ)句方法詳解

    基于JPQL實(shí)現(xiàn)純SQL語(yǔ)句方法詳解

    這篇文章主要介紹了基于JPQL實(shí)現(xiàn)純SQL語(yǔ)句方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • LEFT JOIN關(guān)聯(lián)表中ON,WHERE后面跟條件的區(qū)別

    LEFT JOIN關(guān)聯(lián)表中ON,WHERE后面跟條件的區(qū)別

    本文主要介紹了LEFT JOIN關(guān)聯(lián)表中ON,WHERE后面跟條件的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • mysql數(shù)據(jù)庫(kù)互為主從配置方法分享

    mysql數(shù)據(jù)庫(kù)互為主從配置方法分享

    共有四臺(tái)機(jī)器:A(10.1.10.28),B(10.1.10.29),C(10.1.10.30),D(10.1.10.31)。配置后結(jié)果:A-C互為主從,B為A的slave,D為C的slave
    2012-03-03
  • MySQL MHA 運(yùn)行狀態(tài)監(jiān)控介紹

    MySQL MHA 運(yùn)行狀態(tài)監(jiān)控介紹

    這篇文章主要介紹MySQL MHA 運(yùn)行狀態(tài)監(jiān)控,MHA(Master HA)是一款開(kāi)源的 MySQL 的高可用程序,它為 MySQL 主從復(fù)制架構(gòu)提供了 automating master failover 功能,想具體了解的小伙伴可以和小編一起學(xué)習(xí)下面文章內(nèi)容
    2021-10-10
  • 透徹理解Mysql連接的原理

    透徹理解Mysql連接的原理

    這篇文章主要為大家介紹了Mysql連接原理的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Mysql權(quán)限管理grant命令使筆記

    Mysql權(quán)限管理grant命令使筆記

    這篇文章主要介紹了Mysql權(quán)限管理grant命令使筆記,詳細(xì)記錄了常用權(quán)限管理命令,需要的朋友可以參考下
    2014-05-05
  • mysql 5.7.24 壓縮包安裝配置方法圖文教程

    mysql 5.7.24 壓縮包安裝配置方法圖文教程

    這篇文章主要介紹了mysql 5.7.24 壓縮包安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • mysql運(yùn)行net start mysql報(bào)服務(wù)名無(wú)效的解決辦法

    mysql運(yùn)行net start mysql報(bào)服務(wù)名無(wú)效的解決辦法

    這篇文章主要為大家詳細(xì)介紹了mysql運(yùn)行net start mysql報(bào)服務(wù)名無(wú)效的解決辦法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01

最新評(píng)論