需要解释查询SQL中的Nolock

问题描述 投票:0回答:1

我有以下内容的商店程序:

Create PROC A
(
 @param1 varchar(50)   = NULL
,@param2 varchar(50) = NULL
)
AS
BEGIN

SET NOCOUNT ON;
    BEGIN TRY
        
        UPDATE [dbo].[MyTable1]
        SET [Status]  = 1
          ,[UpdatedUser]  = 'My Update'
          ,[UpdatedDate]  = getdate()
        WHERE (ISNULL(@param1 ,'') = '' OR param1 = @param1 )
        AND (ISNULL(@param2 ,'') = '' OR param2 = @param2 )

        
        UPDATE [dbo].[MyTable2]
        SET [col1]  = 'info 1'
          ,[UpdatedUser]  = 'My Update'
          ,[UpdatedDate]  = getdate()
        WHERE TableCode IN (
            SELECT [TableCode]
            FROM [MyTable1] WITH(NOLOCK)
            WHERE (ISNULL(@param1 ,'') = '' OR param1 = @param1 )
        AND (ISNULL(@param2 ,'') = '' OR param2 = @param2 )
        )

        SELECT 1
    END TRY
    BEGIN CATCH
        SELECT -1
    END CATCH
END

我调用store时有很多错误死锁,主要原因是语句2中where子句中的可预测表MyTable1调用。所以,我不知道

NOLOCK
是否真的在应用?请解释。

我尝试将语句 2 与语句 1 交换,以确保在使用 MyTable1 更新操作之前选择调用

sql deadlock nolock
1个回答
-1
投票

它可能适合你

 UPDATE [dbo].[MyTable2]
    SET [col1]  = 'info 1'
      ,[UpdatedUser]  = 'My Update'
      ,[UpdatedDate]  = getdate()
    WHERE TableCode IN (
        SELECT [TableCode]
        FROM [MyTable1] WITH(NOLOCK)
        WHERE (ISNULL(@param1 ,'') = '' OR param1 = @param1 )
    AND (ISNULL(@param2 ,'') = '' OR param2 = @param2 )
    );

  
  UPDATE [dbo].[MyTable1]
    SET [Status]  = 1
      ,[UpdatedUser]  = 'My Update'
      ,[UpdatedDate]  = getdate()
    WHERE (ISNULL(@param1 ,'') = '' OR param1 = @param1 )
    AND (ISNULL(@param2 ,'') = '' OR param2 = @param2 ) ;

    SELECT 1
END TRY
BEGIN CATCH
    SELECT -1
END CATCH

你需要使用;分号。这是在数据库系统中分隔每个 SQL 语句的标准方法,允许在对服务器的同一调用中执行多个 SQL 语句

© www.soinside.com 2019 - 2024. All rights reserved.