亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Mysql?for?update導致大量行鎖的問題

 更新時間:2023年08月29日 09:57:30   作者:tingmailang  
這篇文章主要介紹了Mysql?for?update?導致大量行鎖的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一、引言

最近同事的復盤會上提到自己for update一個不存在的where條件導致表鎖,然后產(chǎn)生大量的事務失敗和讀寫超時,這時博主非常奇怪,因為雖然網(wǎng)上許多博客寫Innodb的表鎖行鎖與鎖升級,但是事實上這都是錯誤的觀點。

二、分析

首先博主的環(huán)境是Mysql5.7,隔離級別是RC

博主為什么說這些都是錯誤的觀點呢?

因為在《高性能Mysql》和《Innodb存儲引擎當中》,非常明確的提出:

1、Innodb不存在鎖升級

所以不存在因為鎖的數(shù)據(jù)量大或者多表,導致行鎖升級成表鎖。

2、當for update一個不存在的where條件時

Innodb加的是Record級別鎖

這一點可以通過驗證得到

  • 不存在的where:
set autocommit = 0 ;
begin;
select * from t_aac_battery_compensate ?where gmt_create ?in ('2020-05-21 07:02:37') for update ;
  • 存在的where:
begin;
select * from t_aac_***??where gmt_create ?in ('2020-05-21 07:32:37') for update ;

然后執(zhí)行

select * from information_schema.INNODB_LOCKS il?

可以看到鎖

可以看到兩個事務加的都是行級別鎖。

可能有的同學會對鎖住的行數(shù)量和數(shù)據(jù)有疑惑,這里博主發(fā)現(xiàn)這兩個數(shù)值統(tǒng)計的方式是不準的,包括在《Innodb存儲引擎》作者明確提出lock_data是不準確的。

也有的同學疑惑他加行鎖為什么會阻塞其他讀寫,這里是innodb加了行鎖之后最后一起釋放,雖然不知道它這樣的設計是出于什么考慮。

3、Innodb如果在索引中找不到記錄

會在行數(shù)據(jù)進行搜索,鎖住主鍵,而不是鎖表

所以一些博客說根據(jù)索引加不到鎖,innodb就會鎖全表,這是錯誤的理解

只是可能在一些情況下他搜索行數(shù)據(jù)對主鍵加鎖的數(shù)量過多,之前也說了innodb加行鎖是最后一起釋放的,所以阻塞了其他讀寫

4、Innodb加鎖的方式是從上到下的

自動加鎖只有表級別的意向鎖和行級鎖,表級別的意向鎖只會阻塞全表掃描

5、RR級別加鎖情況

上文都是基于博主線上環(huán)境配置,如果是RR隔離級別,還會有GapLock與行鎖進行Next_keyLock算法加鎖,其實簡單說就是鎖住當前B+樹種當前索引到上一個索引之間(或當前行到上一行)的間隔,防止在這個過程中有插入數(shù)據(jù),也就是防止幻讀。

但是這個情況不是絕對的,對于唯一索引,innodb會降低級別行級鎖,不會鎖住范圍

三、總結

通過以上分析得到結論:

1、RC級別下innodb都是行級鎖,表級的意向鎖只會阻塞全表掃描

2、innodb不存在鎖升級

3、innodb加不到索引會搜索行,對主鍵加鎖

4、當for update一個不存在的where條件時,Innodb加的是Record級別鎖

以上分析除了實際操作驗證和權威書籍理解之外,博主與DBA也經(jīng)過深入探討,如果有異議歡迎討論。 另外希望各位同學,多實際操作、多看權威書籍和源碼,對于網(wǎng)上的博客看一半信一半,要有自己的判斷,書籍和源碼的查看也要結合實際經(jīng)驗,因為每個人的腦回路是不一樣的,一不小心理解方向就可能歪了。

好了,這些僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • mysql子查詢(單行子查詢,多行子查詢,多列子查詢)

    mysql子查詢(單行子查詢,多行子查詢,多列子查詢)

    本文主要介紹了mysql子查詢(單行子查詢,多行子查詢,多列子查詢),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 解決MySQL批量新增或修改時出現(xiàn)異常:Lock?wait?timeout?exceeded

    解決MySQL批量新增或修改時出現(xiàn)異常:Lock?wait?timeout?exceeded

    這篇文章主要給大家介紹了關于如何解決MySQL批量新增或修改時出現(xiàn)異常:Lock?wait?timeout?exceeded;try?restarting?transaction的相關資料,需要的朋友可以參考下
    2024-01-01
  • mysql 5.5 安裝配置簡單教程

    mysql 5.5 安裝配置簡單教程

    這篇文章主要為大家詳細介紹了mysql 5.5 安裝配置簡單教程,純文字描述mysql 5.5 安裝配置方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • mysql創(chuàng)建觸發(fā)器時報1064錯誤問題及解決

    mysql創(chuàng)建觸發(fā)器時報1064錯誤問題及解決

    這篇文章主要介紹了mysql創(chuàng)建觸發(fā)器時報1064錯誤問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • mysql中的general_log(查詢?nèi)罩?開啟和關閉

    mysql中的general_log(查詢?nèi)罩?開啟和關閉

    這篇文章主要介紹了mysql中的general_log(查詢?nèi)罩?開啟和關閉問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 詳解數(shù)據(jù)庫語言中的null值

    詳解數(shù)據(jù)庫語言中的null值

    這篇文章主要詳解了數(shù)據(jù)庫語言中的null值,針對MySQL上的實例進行講解,需要的朋友可以參考下
    2015-04-04
  • 詳解Mysql如何實現(xiàn)數(shù)據(jù)同步到Elasticsearch

    詳解Mysql如何實現(xiàn)數(shù)據(jù)同步到Elasticsearch

    要通過Elasticsearch實現(xiàn)數(shù)據(jù)檢索,首先要將Mysql中的數(shù)據(jù)導入Elasticsearch,并實現(xiàn)數(shù)據(jù)源與Elasticsearch數(shù)據(jù)同步,這里使用的數(shù)據(jù)源是Mysql數(shù)據(jù)庫。目前Mysql與Elasticsearch常用的同步機制大多是基于插件實現(xiàn)的,希望這篇文章能對大家有所幫助
    2021-11-11
  • CentOS下重置MySQL的root密碼的教程

    CentOS下重置MySQL的root密碼的教程

    這篇文章主要介紹了CentOS下重置MySQL的root密碼的教程,首先要擁有系統(tǒng)的root權限,最后還附屬了一個使用mysqladmin下的方法,需要的朋友可以參考下
    2015-11-11
  • mysql 5.5 開啟慢日志slow log的方法(log_slow_queries)

    mysql 5.5 開啟慢日志slow log的方法(log_slow_queries)

    MySQL中提供了一個慢查詢的日志記錄功能,可以把查詢SQL語句時間大于多少秒的語句寫入慢查詢?nèi)罩?,日常維護中可以通過慢查詢?nèi)罩镜挠涗浶畔⒖焖贉蚀_地判斷問題所在
    2016-05-05
  • MySQL?中的?SQL_MODE?設置方法ANSI_QUOTES?選項解析與應用小結

    MySQL?中的?SQL_MODE?設置方法ANSI_QUOTES?選項解析與應用小結

    sql_mode是?MySQL?中的一個系統(tǒng)變量,用于控制?SQL?語句的解析和執(zhí)行方式,它由多個選項組成,每個選項都可以獨立設置,以滿足不同的應用場景需求,這篇文章主要介紹了MySQL?中的?SQL_MODE?設置:ANSI_QUOTES?選項解析與應用
    2024-12-12

最新評論