为什么 SERIALIZABLE 级别不会锁定 SQL Server 中其他会话的表

مجت*_*یان 2 sql-server-2008 sql-server query concurrency sql-server-2008-r2

我想防止表中的删除、插入、更新和选择并发,因此我尝试SERIALIZABLE在转换之前使用该表,但这并没有为其他进程锁定该表!如何修复它?

我尝试过什么:

1-创建表_1

    --Create Sample Table
CREATE TABLE [dbo].[Table_1](
    [Number] [bigint] NOT NULL,
    [Price] [bigint] NULL,
 CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
(
    [Number] 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
INSERT [dbo].[Table_1] ([Number], [Price]) VALUES (1, 1000)
GO
INSERT [dbo].[Table_1] ([Number], [Price]) VALUES (2, 3000)
GO
INSERT [dbo].[Table_1] ([Number], [Price]) VALUES (3, 8000)
GO
Run Code Online (Sandbox Code Playgroud)

2- 查询有延迟的会话一:

--SESSION 1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;

WAITFOR DELAY '00:00:10.000'
UPDATE Table_1 SET Price = 6000 WHERE NUMBER = 1
SELECT * FROM Table_1

COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)

3-查询会话二,该查询大多数等待会话一直到结束过程,但事实并非如此!:

--SESSION 2 
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;

SELECT * FROM Table_1

COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Pau*_*ite 6

你的拖延是在错误的地方。

在进行任何更改之前,您在事务 1 中等待十秒钟。

事务 2 没有理由在事务 2 进行任何更改之前等待。

把延迟放在更新之后,你就会看到阻塞。

可序列化隔离级别保证的结果事务按某种顺序顺序运行的结果相同。它并不要求交易实际上以这种方式运行。

如果要阻止所有并发,请采用独占表锁。有关详细信息,请参阅相关的 Q & A请求表上的 Sch-M 锁

  • 不,这不必要地复杂和多余。“HOLDLOCK”只是意味着“可串行化”。它们是同义词。只需采用链接示例中的独占表锁即可。 (5认同)