[英]SELECT statement won't return row first time after INSERT commit transaction
我有两个存储过程,一个AddReportsApi
用于使用BEGIN TRANSACTION
和COMMIT TRANSACTION
插入数据,另一个GetReportsApi
用于选择插入行的数据。
我先调用INSERT
存储过程,然后调用SELECT
存储过程,但有时它不会为WHERE
谓词中使用的传入SearchItemId
返回任何行。
如果我第二次执行 SELECT 存储过程,它会返回预期的行。
向表中插入数据是否有延迟? 请注意,存储过程是从 HangFire 后台作业框架调用的。 根据我的测试,HangFire 应该不会影响 INSERT 和 SELECT 存储过程调用。 在一分钟内多次调用 INSERT 存储过程,将记录插入到 ReprotsApi 表中。
插入存储过程:
CREATE PROCEDURE [dbo].[AddReportsApi]
@OrderID nvarchar(50),
@SearchItemId nvarchar(50),
@SubjectID nvarchar(50),
@SearchType nvarchar(50),
@ApiName nvarchar(50),
@ApiRequest text,
@ApiResponse text,
@IsActive bit,
@CreatedOn datetime,
@CreatedBy nvarchar(50),
@ModifyOn datetime,
@ModifyBy nvarchar(50),
@HitType nvarchar(2)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRANSACTION
INSERT INTO [dbo].[ReportsApi] ([OrderID], [SearchItemId], [SubjectID], [SearchType],
[ApiName], [ApiRequest], [ApiResponse], [IsActive],
[CreatedOn], [CreatedBy],
[ModifyOn], [ModifyBy], [HitType])
VALUES (@OrderID, @SearchItemId, @SubjectID, @SearchType,
@ApiName, @ApiRequest, @ApiResponse, @IsActive,
@CreatedOn, @CreatedBy,
@ModifyOn, @ModifyBy, @HitType)
IF (@@ERROR != 0)
BEGIN
ROLLBACK TRANSACTION
END
ELSE
COMMIT TRANSACTION
END
SELECT 存储过程:
CREATE PROCEDURE [dbo].[GetReportsApi]
@OrderID nvarchar(50)
,@SearchItemId nvarchar(50)
,@SubjectID nvarchar(50)
,@CreatedBy nvarchar(50)
AS
BEGIN
SET NOCOUNT ON;
SELECT [Id]
,[OrderID]
,[SearchItemId]
,[SubjectID]
,[SearchType]
,[ApiName]
,[ApiRequest]
,[ApiResponse]
,[IsActive]
,[CreatedOn]
,[CreatedBy]
,[ModifyOn]
,[ModifyBy]
,[HitType]
FROM [dbo].[ReportsApi] WHERE [SearchItemId] = @SearchItemId
END
这可能是因为索引在插入完成后正在后台重建。 这会产生脏读/幻读。 如果您在 [SearchItemId] 上有索引,那么第二个查询可能会使用它,但索引可能仍在刷新。
如果您要插入到 B 树的中间,这甚至会影响聚簇索引。
坚持 sleep(10000) 或 WAITFOR DELAY '00:00:10' 可能是值得的; 进入你的代码......(那是 10 秒,但你可以尝试不同的时间。)
祝你好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.