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

mysql for update是鎖表還是鎖行實(shí)例詳解

 更新時(shí)間:2024年03月14日 09:20:39   作者:架構(gòu)成長(zhǎng)指南  
在并發(fā)一致性控制場(chǎng)景中,我們常常用for update悲觀鎖來(lái)進(jìn)行一致性的保證,但是如果不了解它的機(jī)制,就進(jìn)行使用,很容易出現(xiàn)事故,比如for update進(jìn)行了鎖表導(dǎo)致其他請(qǐng)求只能等待,從而拖垮系統(tǒng),這篇文章主要介紹了mysql for update是鎖表還是鎖行操作,需要的朋友可以參考下

在并發(fā)一致性控制場(chǎng)景中,我們常常用for update悲觀鎖來(lái)進(jìn)行一致性的保證,但是如果不了解它的機(jī)制,就進(jìn)行使用,很容易出現(xiàn)事故,比如for update進(jìn)行了鎖表導(dǎo)致其他請(qǐng)求只能等待,從而拖垮系統(tǒng),因此了解它的原理是非常必要的,下面我們通過(guò)一系列示例進(jìn)行測(cè)試,來(lái)看看到底是什么場(chǎng)景下鎖表什么場(chǎng)景下鎖行

驗(yàn)證

示例說(shuō)明

創(chuàng)建一個(gè)賬戶表,插入基礎(chǔ)數(shù)據(jù),以唯一索引、普通索引、主鍵普通字段4 個(gè)維度進(jìn)行select ... for update查詢,查看是進(jìn)行鎖表還是鎖行

表創(chuàng)建

創(chuàng)建一個(gè)賬戶表,指定account_no為唯一索引、id為主鍵、user_no為普通字段、curreny為普通索引

CREATE TABLE `account_info` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'ID' ,
	`account_no` int NOT NULL COMMENT '賬戶編號(hào)',
	`user_no` varchar(32) NOT NULL COMMENT '用戶 Id',
	`currency` varchar(10) NOT NULL COMMENT '幣種',
  `amount` DECIMAL(10,2) NOT NULL COMMENT '金額',
	`freeze_amount` DECIMAL(10,2) NOT NULL COMMENT '凍結(jié)金額',
  `create_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '創(chuàng)建時(shí)間',
  `update_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改時(shí)間',
  PRIMARY KEY (`id`) USING BTREE,
	UNIQUE KEY `uni_idx_account_no` (`account_no`) ,
	KEY `idx_currency_` (`currency`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='賬戶信息表';

插入基礎(chǔ)數(shù)據(jù)

insert into account_info values (1,1,'ur001','RMB',100,0,now(),now());
insert into account_info values (2,2,'ur002','RMB',1000,0,now(),now());
insert into account_info values (3,3,'ur002','DOLLAR',200,0,now(),now());

根據(jù)主鍵查詢

在事務(wù) 1 中,根據(jù)主鍵id=1 進(jìn)行 for update查詢時(shí),事務(wù)2、事務(wù) 3 都進(jìn)行阻塞,而事務(wù) 4 由于更新的id=2 所以成功,因此判定,根據(jù)主鍵進(jìn)行 for update 查詢時(shí)是行鎖

根據(jù)唯一索引查詢

在事務(wù) 1 中,根據(jù)唯一索引account_no=1 進(jìn)行 for update查詢時(shí),事務(wù)2、事務(wù) 3 都進(jìn)行阻塞,而事務(wù) 4 由于更新的account_no=2 所以成功,因此判定,根據(jù)唯一索引進(jìn)行 for update 查詢時(shí)是行鎖

根據(jù)普通索引查詢

在事務(wù) 1 中,根據(jù)普通索引currency='RMB' 進(jìn)行 for update查詢時(shí),事務(wù)2、事務(wù) 3 都進(jìn)行阻塞,而事務(wù) 4 由于更新的currency='DOLLAR`所以成功,因此判定,根據(jù)普通索引進(jìn)行 for update 查詢時(shí)是行鎖

根據(jù)普通字段查詢

在事務(wù) 1 中,根據(jù)普通字段user_no='ur001' 進(jìn)行 for update查詢時(shí),事務(wù)2、事務(wù) 3 都進(jìn)行阻塞,而事務(wù) 4查詢的是user_no='ur002'也進(jìn)行阻塞,因此判定,根據(jù)普通字段進(jìn)行 for update 查詢時(shí)是表鎖

總結(jié)

如果查詢條件是索引/主鍵字段,那么select ..... for update會(huì)進(jìn)行行鎖

如果查詢條件是普通字段(沒(méi)有索引/主鍵),那么select ..... for update會(huì)進(jìn)行鎖表,這點(diǎn)一定要注意。

掃描下面的二維碼關(guān)注我們的微信公眾帳號(hào),在微信公眾號(hào)中共同學(xué)習(xí)。

到此這篇關(guān)于mysql for update是鎖表還是鎖行實(shí)例詳解的文章就介紹到這了,更多相關(guān)mysql for update內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis動(dòng)態(tài)傳入order?by問(wèn)題

    Mybatis動(dòng)態(tài)傳入order?by問(wèn)題

    這篇文章主要介紹了Mybatis動(dòng)態(tài)傳入order?by問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • MySQL事務(wù)隔離機(jī)制詳解

    MySQL事務(wù)隔離機(jī)制詳解

    在數(shù)據(jù)庫(kù)中,事務(wù)是指一組邏輯操作,這些操作要么全部執(zhí)行,要么全部不執(zhí)行,是一個(gè)不可分割的工作單位,這篇文章主要介紹了MySQL事務(wù)隔離機(jī)制,需要的朋友可以參考下
    2022-11-11
  • 解決mysql登錄錯(cuò)誤:''Access denied for user ''root''@''localhost''

    解決mysql登錄錯(cuò)誤:''Access denied for user ''root''@''localhost''

    這篇文章主要介紹了mysql登錄錯(cuò)誤:'Access denied for user 'root'@'localhost',本文給出了操作過(guò)程及注意事項(xiàng),需要的朋友可以參考下
    2019-11-11
  • 往MySQL中存儲(chǔ)圖片的方法

    往MySQL中存儲(chǔ)圖片的方法

    這篇文章主要介紹了往MySQL中存儲(chǔ)圖片的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • mysql獲取分組后每組的最大值實(shí)例詳解

    mysql獲取分組后每組的最大值實(shí)例詳解

    這篇文章主要介紹了 mysql獲取分組后每組的最大值實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • MySQL中INSERT INTO的具體使用

    MySQL中INSERT INTO的具體使用

    INSERT INTO 是 MySQL 數(shù)據(jù)庫(kù)中非常重要的一種 SQL 命令,用于將新行插入到表中,本文主要介紹了MySQL中INSERT INTO的具體使用,感興趣的可以了解一下
    2024-03-03
  • MySQL中登錄與退出超全圖文講解

    MySQL中登錄與退出超全圖文講解

    大多數(shù)人都認(rèn)為在不需要事務(wù)化處理的情況下,MySQL是管理內(nèi)容最好的選擇,下面這篇文章主要給大家介紹了關(guān)于MySQL中登錄與退出圖文講解的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • MySql索引原理和SQL優(yōu)化方式

    MySql索引原理和SQL優(yōu)化方式

    索引是提升數(shù)據(jù)庫(kù)查詢效率的有序存儲(chǔ)結(jié)構(gòu),包括主鍵索引、唯一索引、普通索引等,約束則用于數(shù)據(jù)完整性,包含主鍵、唯一、外鍵等約束,B+樹(shù)是常用的索引結(jié)構(gòu),減少磁盤(pán)IO次數(shù),索引應(yīng)用場(chǎng)景包括where、groupby、orderby
    2024-09-09
  • MySQL使用Sequence創(chuàng)建唯一主鍵的實(shí)現(xiàn)示例

    MySQL使用Sequence創(chuàng)建唯一主鍵的實(shí)現(xiàn)示例

    Sequence提供了更多的靈活性,本文主要介紹了MySQL使用Sequence創(chuàng)建唯一主鍵的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • 深入理解MySQL中MVCC與BufferPool緩存機(jī)制

    深入理解MySQL中MVCC與BufferPool緩存機(jī)制

    這篇文章主要介紹了深入理解MySQL中MVCC與BufferPool緩存機(jī)制,MySQL默認(rèn)RR隔離級(jí)別就是通過(guò)該機(jī)制來(lái)保證的MVCC,更多主題相關(guān)內(nèi)容,需要的可以參考下面文章內(nèi)容介紹
    2022-05-05

最新評(píng)論