成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

數(shù)據(jù)庫 MySQL
本文我們通過一系列示例進(jìn)行測(cè)試,來看看到底是什么場(chǎng)景下鎖表什么場(chǎng)景下鎖行。

在并發(fā)一致性控制場(chǎng)景中,我們常常用for update悲觀鎖來進(jìn)行一致性的保證,但是如果不了解它的機(jī)制,就進(jìn)行使用,很容易出現(xiàn)事故,比如for update進(jìn)行了鎖表導(dǎo)致其他請(qǐng)求只能等待,從而拖垮系統(tǒng),因此了解它的原理是非常必要的,下面我們通過一系列示例進(jìn)行測(cè)試,來看看到底是什么場(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é)任編輯:趙寧寧 來源: 架構(gòu)成長指南
相關(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ù)庫

2022-12-18 16:56:07

索引MySQL

2020-10-20 13:50:47

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

2010-05-24 12:50:59

MySQL表級(jí)鎖

2023-01-11 09:56:41

索引SQL

2020-02-06 10:02:45

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

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ù)庫

2025-06-04 02:55:00

MySQL意向鎖記錄鎖

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í)鎖
點(diǎn)贊
收藏

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

主站蜘蛛池模板: www四虎影视| 天堂视频中文在线 | 一级电影免费看 | 色综合99 | 久久99精品久久久久 | 日韩精品一区二区三区四区视频 | h免费观看 | 91在线视频精品 | 亚洲精品国产综合区久久久久久久 | 高清一区二区三区 | 亚洲视频免费在线观看 | 国产精品久久久久一区二区三区 | 男女网站视频 | 久久久久久亚洲国产精品 | 中文字幕高清av | 福利网址 | 精品国产一二三区 | 日韩午夜电影在线观看 | 久久一日本道色综合久久 | 欧美视频在线看 | av电影一区 | 国产一区三区在线 | 日批免费在线观看 | 蜜桃视频在线观看免费视频网站www | 男女精品久久 | 在线观看三级av | 一区二区三区日韩 | 欧美一区二区三区在线播放 | 五月婷婷丁香婷婷 | 黄色成人免费在线观看 | 亚洲一区二区在线播放 | 精品视频在线一区 | 国产一区二区日韩 | 激情a| 中文字幕一区在线观看视频 | 日日天天| 欧美freesex黑人又粗又大 | 亚洲一区二区三区桃乃木香奈 | 日韩视频在线播放 | 日韩精品一| 久久视频精品 |