微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

同时执行的查询死锁

如何解决同时执行的查询死锁

| 我有一个执行以下操作(简化)的存储过程:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRANSACTION 

DECLARE @intNo int
SET @intNo = (SELECT MAX(intNo) + 1 FROM tbl)
INSERT INTO tbl(intNo)
Values (@intNo)

SELECT intNo  
      FROM tbl
      WHERE (intBatchNumber = @intNo - 1)  

COMMIT TRANSACTION
我的问题是,当两个或多个用户同时执行此操作时,我将陷入僵局。现在,据我了解,我在proc中进行第一次选择时,应该会在tbl中创建一个锁。如果在第一个过程仍在执行时调用第二个过程,则应等待第二个过程完成,对吗? 目前这造成了僵局,有什么想法吗?     

解决方法

insert
查询所需要的锁与
select
不同。
select
的锁定会阻止第二个
insert
,但不会阻止第二个
select
。因此,两个查询都可以以ѭ2开始,但是它们都阻塞在另一个s1上。 您可以通过要求第一个查询锁定整个表来解决此问题:
SET @intNo = (SELECT MAX(intNo) + 1 FROM tbl with (tablockx))
                                             ^^^^^^^^^^^^^^^
这会使第二笔交易的ѭ2等待第一笔交易的完成。     ,使它更简单,使您只有一条语句而无需事务
--BEGIN TRANSACTION  not needed

INSERT INTO tbl(intNo)
OUTPUT INSERTED.intNo
SELECT MAX(intNo) + 1 FROM tbl WITH (TABLOCK)

--COMMIT TRANSACTION not needed
虽然,为什么不使用IDENTITY ...?     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。