多个进程正在调用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
为了获得问题的答案,您应该包括更多信息,至少应包括死锁图。
首先,尝试如下启用TP
DBCC TRACEON (1204, -1)
DBCC TRACEON (1222, -1),
然后发生死锁并从SQL Server错误日志中添加一些信息。
为了发现更多有关阻止/锁定/解除锁定的信息,请查看这些资源