小编pok*_*oke的帖子

Sql Server - 在插入另一个事务时选择会产生意外结果

我偶然发现了从根本上改变了我对事务和锁定的知识的情况(虽然我知道的不多),我需要帮助来理解它。

假设我有一张这样的表:

CREATE TABLE [dbo].[SomeTable](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[SomeData] [varchar](200) NOT NULL,
[Moment] [datetime] NOT NULL,
[SomeInt] [bigint] NOT NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我运行这个“在事务中插入 1000 行”查询:

BEGIN TRAN t1

DECLARE @i INT = 0

WHILE @i < 1000
BEGIN
    SET @i = @i + 1

    INSERT INTO [SomeTable] ([SomeData] ,Moment, SomeInt)
    VALUES (CONVERT(VARCHAR(255), NEWID()), getdate(), @i)

    WAITFOR DELAY '00:00:00:010'
END

COMMIT TRAN t1
Run Code Online (Sandbox Code Playgroud)

在此事务运行时,我正在执行一个简单的选择:

SELECT Id, Moment, SomeData, SomeInt FROM [SomeTable]
Run Code Online (Sandbox Code Playgroud)

并非总是可以重现它(显然取决于时间),但有时选择查询将在插入事务完成后返回少于 1000 行。在我的无知中,我相信 select 将始终返回 1000 行(鉴于隔离级别为 …

index sql-server sql-server-2008-r2 transaction

8
推荐指数
1
解决办法
6325
查看次数