自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL中select for update是鎖表還是鎖行

數(shù)據(jù)庫(kù) MySQL
本文我們通過一系列示例進(jìn)行測(cè)試,來(lái)看看到底是什么場(chǎng)景下鎖表什么場(chǎ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),因此了解它的原理是非常必要的,下面我們通過一系列示例進(jìn)行測(cè)試,來(lái)看看到底是什么場(chǎng)景下鎖表什么場(chǎng)景下鎖行。

驗(yàn)證

1.示例說明

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

2.表創(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());

3.根據(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í)是行鎖。

4.根據(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í)是行鎖。

5.根據(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í)是行鎖。

6.根據(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)行行鎖。

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

責(zé)任編輯:趙寧寧 來(lái)源: 架構(gòu)成長(zhǎng)指南
相關(guān)推薦

2025-02-10 09:58:48

2024-06-14 09:27:00

2023-11-06 08:35:08

表鎖行鎖間隙鎖

2023-10-25 08:21:15

悲觀鎖MySQL

2023-01-27 20:59:19

行鎖表鎖查詢

2024-11-29 07:38:12

MySQL數(shù)據(jù)庫(kù)

2022-12-18 16:56:07

索引MySQL

2010-05-24 12:50:59

MySQL表級(jí)鎖

2020-10-20 13:50:47

MySQL數(shù)據(jù)庫(kù)

2023-01-11 09:56:41

索引SQL

2020-02-06 10:02:45

MySQL數(shù)據(jù)庫(kù)全局鎖

2018-07-31 10:10:06

MySQLInnoDB死鎖

2022-07-20 08:06:57

MySQL表鎖Innodb

2022-10-24 00:33:59

MySQL全局鎖行級(jí)鎖

2024-04-10 14:27:03

MySQL數(shù)據(jù)庫(kù)

2010-11-22 14:27:05

MySQL鎖表

2024-03-04 07:37:40

MySQL記錄鎖

2010-05-24 12:26:26

MySQL鎖表

2024-05-13 12:44:00

InnodbMySQL行級(jí)鎖

2021-07-19 12:51:34

存儲(chǔ)InnoDB行鎖
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)