如果不存在,则插入SQL,然后选择不成为死锁的受害者

时间:2018-05-31 11:48:56

标签: sql sql-server tsql

所以我的过程就像这样

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.."

这是设计的吗?我可以让第二个过程等待而不是成为受害者吗?

2 个答案:

答案 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;