SQL 插入(如果不存在),则选择不成为死锁受害者



所以我的程序是这样的

IF Exists () 
Select
Else 
Set Transaction isolation level serializable
Begin Tran
If not exists()
Insert
Select
Commit Tran

当我同时运行进程时,我得到

"Transaction was deadlocked on lock resources with anothre process and has been chosen as the deadlock victim.."

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

避免死锁的一种方法是在NOT EXISTS子查询中添加 (UPDLOCK( 提示。UPDLOCK 与其他 UPDLOCK 不兼容,因此执行同一进程的多个会话对同一资源的访问将被序列化。锁定将在交易期间保持,并在COMMIT期间释放。

IF NOT EXISTS(SELECT 1 FROM dbo.YourTable WITH (UPDLOCK) WHERE YourKey = @YourKey)

将以下命令放在存储过程的开头附近:

set transaction isolation level read uncommitted;

最新更新