繁体   English   中英

SELECT 语句在 INSERT 提交事务后不会第一次返回行

[英]SELECT statement won't return row first time after INSERT commit transaction

我有两个存储过程,一个AddReportsApi用于使用BEGIN TRANSACTIONCOMMIT 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM