sql - WITH (UPDLOCK, HOLDLOCK) 和非唯一索引 - 它会锁定整个表吗?
问题描述
我在 regionId 列上有一个带有非唯一索引的表:
CREATE TABLE [dbo].[Localizations]
(
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](50) NOT NULL,
[regionId] [int] NOT NULL,
CONSTRAINT [PK_Localizations]
PRIMARY KEY CLUSTERED ([id] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [RegionId_index]
ON [dbo].[Localizations] ([regionId] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
我正在执行以下查询:
BEGIN TRAN;
IF NOT EXISTS(SELECT 1
FROM [dbo].[Localizations] WITH (UPDLOCK, HOLDLOCK)
WHERE regionId = 1)
BEGIN
WAITFOR DELAY '00:00:10';
INSERT INTO [dbo].[Localizations]
VALUES ('aa', 1);
END;
COMMIT;
同时以下查询:
UPDATE [dbo].[Localizations]
SET name = 'bb'
WHERE regionid = 2
第二个查询一直等到第一个查询结束。如果我将列的非唯一索引更改为regionId
列的唯一索引,regionId
则第二个查询将立即执行。:O 为什么?
这是否意味着列的非唯一索引regionId
以及WITH (UPDLOCK, HOLDLOCK)
锁定整个表?
解决方案
推荐阅读
- cmake - 交叉编译和链接到 sysroot 中的库 - 出了什么问题?
- ios - 如何使用 HTML 标签快速显示表格
- r - R编程中函数中的ifelse未使用参数(3)错误
- powershell - 奇怪的 CSV 输出
- python - 如何在弹性搜索查询中聚合嵌套对象的 doc_inner-hits
- sql - 多个 OR 条件在 SQL 连接查询中不起作用
- angular - !: Angular 中的(爆炸冒号)符号
- c - 如何在 C 中打印 wchar_t 变量
- node.js - 如何在 Node.js 中从 Google Cloud Functions 调用 Oracle DB
- python - 如何更改 Celery beat 服务的默认路径?