3

我的数据库中有 2 个表,一个包含有关客户端的数据(称为 Clients),另一个表包含 clientID、Guid、AddedTime 和 IsValid(称为 ClientsToUpdate)。

ClientID与clients表相关,Guid是唯一标识符,AddedTime是记录被添加到表中的时间,IsValid是这个ClientID是否更新的位指示。

我想要做的是更新他们的 ID 在 ClientsToUpdate 中的所有客户端,问题是,ClientsToUpdate 表包含超过 80,000 条记录,我遇到了死锁。

虽然我可以做的是一次更新 2000 个客户端,使用 while 循环或类似的东西。

我的存储过程如下所示:

UPDATE client SET LastLogin=GETDATE() 
FROM Clients client
JOIN ClientsToUpdate ctu ON client.ID = ctu.ClientID;

知道我该怎么做吗?

4

2 回答 2

4
declare @done table (ClientID int primary key)
while 1=1
    begin

    update  top (2000) c
    set     lastlogin = getdate()
    output  deleted.id into @done
    from    Clients c
    join    ClientsToUpdate ctu
    on      c.id = ctu.ClientID
    where   not exists
            (
            select  *
            from    @done d
            where   d.ClientID = ctu.ClientID
            )

    if @@rowcount = 0
        break
    end

SQL Fiddle 的示例。

于 2012-10-28T08:43:30.077 回答
0

如果您遇到死锁,分块更新可能会减少错误(假设您仔细管理事务并提交块更新),但不会解决死锁起源。恕我直言,您应该调查锁定问题并找出死锁的原因

于 2012-10-28T10:08:41.173 回答