mysql的InnoDB使用行鎖的限制
MySQL 默認(rèn)使用的是行鎖還是表鎖,取決于你使用的存儲(chǔ)引擎。
在現(xiàn)代 MySQL 開發(fā)中,默認(rèn)的存儲(chǔ)引擎是 InnoDB,因此通常情況下,MySQL 默認(rèn)使用的是行鎖(Row Lock)。
為了讓你更清晰地理解,我們需要區(qū)分兩種主要引擎的默認(rèn)行為:
1. 核心結(jié)論:看引擎
| 存儲(chǔ)引擎 | 默認(rèn)鎖粒度 | 特點(diǎn) | 適用場(chǎng)景 |
|---|---|---|---|
| InnoDB (默認(rèn)) | 行鎖 (Row Lock) | 并發(fā)性能高,支持事務(wù)。 | 絕大多數(shù)業(yè)務(wù)場(chǎng)景(高并發(fā)、寫操作多)。 |
| MyISAM (老舊) | 表鎖 (Table Lock) | 并發(fā)性能低,不支持事務(wù)。 | 僅讀或讀多寫少的歷史遺留系統(tǒng)。 |
2. 深度解析:InnoDB 的“行鎖陷阱”
雖然 InnoDB 默認(rèn)是行鎖,但這并不代表它永遠(yuǎn)只鎖行。這是很多開發(fā)者容易踩的坑。InnoDB 的行鎖是通過索引來實(shí)現(xiàn)的。
正常情況(走索引):
如果你的 SQL 語句(如UPDATE或DELETE)在WHERE條件中用到了索引,InnoDB 會(huì)精準(zhǔn)鎖定符合條件的那一行(或幾行)。例子:UPDATE user SET name='A' WHERE id = 1; (假設(shè) id 是主鍵)
結(jié)果:只鎖住 id=1 這一行,其他行不受影響。異常情況(不走索引):
如果你的 SQL 語句在WHERE條件中沒有用到索引,InnoDB 無法定位到具體的行,它會(huì)進(jìn)行全表掃描。為了確保數(shù)據(jù)一致性,它會(huì)將掃描過的所有行都鎖住。這在效果上等同于表鎖。例子:UPDATE user SET name='A' WHERE status = 1; (假設(shè) status 字段沒有索引)
結(jié)果:鎖住整張表的所有行,其他事務(wù)無法修改表中任何數(shù)據(jù),直到事務(wù)提交。
3. 特殊情況:什么時(shí)候會(huì)強(qiáng)制用表鎖?
即使是 InnoDB 引擎,在以下情況也會(huì)使用表鎖:
- DDL 操作:執(zhí)行
ALTER TABLE修改表結(jié)構(gòu)時(shí),通常會(huì)鎖住整張表(雖然新版本支持在線 DDL,但在特定階段仍會(huì)加鎖)。 - 顯式加鎖:手動(dòng)執(zhí)行
LOCK TABLES table_name WRITE;命令。 - 全表更新:執(zhí)行不帶
WHERE條件的UPDATE或DELETE語句。
總結(jié)建議
為了保證 MySQL 發(fā)揮最佳的并發(fā)性能(即使用行鎖),請(qǐng)務(wù)必遵循以下原則:
使用 InnoDB 引擎(這是默認(rèn)選項(xiàng),不要改)。
到此這篇關(guān)于mysql的InnoDB使用行鎖的限制的文章就介紹到這了,更多相關(guān)mysql InnoDB行鎖限制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql 5.7.17 安裝配置方法圖文教程(CentOS7)
這篇文章主要為大家詳細(xì)介紹了CentOS7下mysql 5.7.17 安裝配置方法圖文教程,感興趣的小伙伴們可以參考一下2016-12-12
mysql 5.7.21解壓版安裝配置方法圖文教程(win10)
這篇文章主要為大家詳細(xì)介紹了win10下mysql 5.7.21解壓版安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
MySQL如何基于Explain關(guān)鍵字優(yōu)化索引功能
這篇文章主要介紹了MySQL如何基于Explain關(guān)鍵字優(yōu)化索引功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
mysql數(shù)據(jù)校驗(yàn)過程中的字符集問題處理
在日常應(yīng)用中,我們經(jīng)常會(huì)遇到在不同的字符集的數(shù)據(jù)庫直接進(jìn)行數(shù)據(jù)的導(dǎo)入導(dǎo)出操作,針對(duì)這個(gè)問題,我們來進(jìn)行討論下2014-05-05
mysql case when group by 實(shí)例詳解
這篇文章主要介紹了mysql 中類似php switch case 的語句,需要的朋友可以參考下2018-01-01
MySQL?更新字段的值為當(dāng)前最大值加1的解決方案
本文介紹MySQL中通過UPDATE/INSERT結(jié)合SELECT語句,將字段值更新為當(dāng)前最大值加1的方法,涵蓋嵌套子查詢與自定義變量方案,后者更高效適用于批量操作,感興趣的朋友跟隨小編一起看看吧2025-07-07
mysql存儲(chǔ)過程實(shí)現(xiàn)split示例
這篇文章主要介紹了mysql存儲(chǔ)過程實(shí)現(xiàn)split示例,需要的朋友可以參考下2014-05-05
MySQL中ADD?COLUMN添加多個(gè)字段的寫法實(shí)例
這篇文章主要給大家介紹了關(guān)于MySQL中ADD?COLUMN添加多個(gè)字段的寫法實(shí)例,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-02-02
在MySQL中使用mysqlbinlog flashback的簡單教程
這篇文章主要介紹了在MySQL中使用mysqlbinlog flashback的簡單教程,可以很方便地恢復(fù)數(shù)據(jù),作者還列出了使用時(shí)一些需要注意的地方,需要的朋友可以參考下2015-05-05

