所以我的程序是这样的
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;