更新同一张表时出现死锁-SQL

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

[有一个存储过程可以为所有员工更新pre_plan和pre_type。而且它陷入僵局。

访问表和关联表的DDL:

CREATE TABLE [dbo].[Associate](
    [pre_plan_id] [smallint] NULL,
    [pre_type_id] [smallint] NULL,
    [associate_id] [smallint] NOT NULL,
    [deleted] [bit] NOT NULL
)  

INSERT INTO Associate 
VALUES 
(NULL,  NULL,   -32768, 0),
(NULL,  NULL,   2,  1),
(NULL,  NULL,   3,  0),
(NULL,  NULL,   6,  1),
(NULL,  NULL,   3097,   1),
(NULL,  NULL,   3109,   0),
(NULL,  NULL,   3265,   1),
(NULL,  NULL,   3313,   0),
(NULL,  NULL,   3318,   1),
(NULL,  NULL,   3329,   0)


CREATE TABLE [dbo].[Visit](
    [type_id] [smallint] NOT NULL,
    [plan_id] [smallint] NOT NULL,
    [associate_id] [smallint] NOT NULL,
    [time_in] [smalldatetime] NOT NULL
) 
INSERT INTO Visit 
VALUES
(390,   31, 3109,   '2009-09-02'),
(304,   32, 3109,   '2010-02-05'),
(388,   31, 3109,   '2010-09-24'),
(388,   31, 3109,   '2010-09-27'),
(388,   31, 3109,   '2010-09-27'),
(388,   31, 3109,   '2010-09-28'),
(388,   31, 3109,   '2010-10-01'),
(333,   28, 3109,   '2011-01-11'),
(338,   30, 3109,   '2011-01-18'),
(388,   31, 3109,   '2011-01-27')

存储过程

CREATE PROCEDURE [dbo].[update_pre__] 

AS

UPDATE Associate SET pre_plan_id = 
      (SELECT TOP 1 plan_id 
         FROM Visit  
        WHERE associate_id = Associate.associate_id 
          AND time_in > 90
        GROUP BY plan_id 
        ORDER BY Count(*) DESC)
 WHERE deleted = 0

UPDATE Associate SET pre_type_id = 
      (SELECT TOP 1 [type_id] 
         FROM Visit 
        WHERE associate_id = Associate.associate_id 
          AND time_in > 90
        GROUP BY [type_id] 
        ORDER BY Count(*) DESC)
 WHERE deleted = 0 

[我当时想将两个更新语句上分别添加BEGIN TRANSACTIONCOMMIT TRANSACTION的事务分开。它有助于避免僵局吗?谁能帮助我提出避免僵局的最有效方法?

sql tsql sql-update deadlock database-deadlocks
1个回答
-1
投票

Meybe使用WITH (NOLOCK)操作时使用SELECT CRUD是一个主意

[其含义,使用READ UNCOMMITED作为SELECT查询上的事务隔离级别。

With (NOLOCK)引用表的当前状态,并忽略当前操作的其他操作。 重要:您可能会错过所选表中不同事务的未提交操作脏读]

(SELECT TOP 1 [type_id] 
   FROM Visit With (NOLOCK)
  WHERE associate_id = Associate.associate_id 
    AND time_in > 90
GROUP BY [type_id] 
ORDER BY Count(*) DESC)
© www.soinside.com 2019 - 2024. All rights reserved.