所以我的过程就像这样
IF Exists ()
Select
Else
Set Transaction isolation level serializable
Begin Tran
If not exists()
Insert
Select
Commit Tran
当我同时运行proc时,我得到了
"Transaction was deadlocked on lock resources with anothre process and has been chosen as the deadlock victim.."
这是设计的吗?我可以让第二个过程等待而不是成为受害者吗?
答案 0 :(得分:2)
避免死锁的一种方法是添加(UPDLOCK)提示NOT EXISTS
子查询。 UPDLOCK与其他UPDLOCK不兼容,因此执行相同proc的多个会话对同一资源的访问将被序列化。锁定将在交易期间保留,并在COMMIT
期间解除。
IF NOT EXISTS(SELECT 1 FROM dbo.YourTable WITH (UPDLOCK) WHERE YourKey = @YourKey)
答案 1 :(得分:0)
将此命令放在存储过程的开头附近:
set transaction isolation level read uncommitted;