存储过程中的SQL Server死锁

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

多个进程正在调用getNextOID存储过程。我们已经对阴阳进行了压力测试,但从未陷入僵局。但是,在生产环境中,我们每天都会看到一些。谁能解释这个简单的代码如何产生死锁?

CREATE Procedure [dbo].[GetNextOID]
@OID int Output as 

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
Begin TRAN T1 
    SELECT @OID = identifier from identifiertable where type = 'ObjectID' 

    update identifiertable set updatetime = Current_TimeStamp, identifier = identifier + 1 where type = 'ObjectID'

    If @@ERROR <> 0 goto OnError

Commit Tran T1

IF @@RowCount > 0 
     RETURN 0
ELSE
   RETURN -1

OnError:
    Rollback Tran T1
    Return -1
sql-server deadlock
1个回答
0
投票

为了获得问题的答案,您应该包括更多信息,至少应包括死锁图。

首先,尝试如下启用TP

DBCC TRACEON (1204, -1)
DBCC TRACEON (1222, -1), 

然后发生死锁并从SQL Server错误日志中添加一些信息。

为了发现更多有关阻止/锁定/解除锁定的信息,请查看这些资源

Building a Custom Blocked Process Report

SQL Server Concurrency by Kalen Delaney

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