1

我有两个存储过程,一个AddReportsApi用于使用BEGIN TRANSACTIONand插入数据COMMIT TRANSACTION,另一个GetReportsApi用于选择插入行的数据。

INSERT首先调用存储过程,然后调用SELECT存储过程,但有时它不会为谓词SearchItemId中使用的传入行返回任何行。WHERE

如果我第二次执行 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 

选择存储过程:

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 
4

1 回答 1

0

这可能是因为在插入完成后索引正在底层重建。这会产生脏读/幻读。如果您在 [SearchItemId] 上有一个索引,那么第二个查询可能会使用它,但索引可能仍会被刷新。

如果您要插入 B 树的中间,这甚至会影响聚集索引。

可能值得坚持 sleep(10000) 或 WAITFOR DELAY '00:00:10'; 进入你的代码......(那是 10 秒,但你可以尝试不同的时间。)

祝你好运!

于 2020-06-10T16:16:42.197 回答