如何解决SQL事务死锁
我有一个名为Table_1的表(SQL Server 2014)。它有两列(名称,ID)
我想同时在两个单独的连接中运行以下脚本:
while 1 = 1
begin
begin try
SET TRANSACTION ISOLATION LEVEL Serializable;
begin tran
declare @maxId int = 0
select @maxId = MAX(Id) + 1 from [dbo].[Table_1]
print(@maxId)
set identity_insert [dbo].[Table_1] on
INSERT INTO [dbo].[Table_1] (Id,[Name])
VALUES (@maxId,'11')
set identity_insert [dbo].[Table_1] off
commit tran
end try
begin catch
IF(@@TRANCOUNT > 0)
rollback tran
print ( ERROR_MESSAGE())
print ( ERROR_SEVERITY())
print ( ERROR_STATE())
end catch
end
在此脚本中,我在while循环内的表中插入了行。当该脚本的两个实例运行时,出现以下错误:
事务(进程ID 62)在以下情况下在锁定资源上死锁 另一个过程,已被选为死锁受害者。重新运行 交易。
为什么不同连接中的不同事务不会彼此等待,而出现死锁错误?
我已更正了我的问题,以更好地理解我的意思。 实际上,我不用。 我只是模拟对数据库的高要求(在不同的过程中)以检查一致性并检查并发问题。
查询的歧义部分是为什么会死锁? 一个过程有两个动作:
select from Table_1
和
insert into Table_1
它们都放在单个事务和单个过程中。 我预计会超时,但是为什么会死锁。 我对死锁的了解是,当我们有两个资源和两个事务时,如果Transaction1锁定resource1,同时Transaction2锁定resource2,而他们又需要锁定其他资源(Transaction1锁定resource2,而Transaction2锁定resource1)。但是他们两个都不能锁定第二个资源。 在这种情况下,db引擎会终止具有死锁异常的事务之一。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。