gpt4 book ai didi

sql-server - 更新单个表上的两个不同行时发生死锁

转载 作者:行者123 更新时间:2023-12-03 03:05:52 26 4
gpt4 key购买 nike

读了很多关于死锁的文章,当我以为我很了解它时,问题就来了。

有两笔类似的交易同时进行。它们如下所示:

BEGIN TRAN //read_committed_snapshot ON

//an application sends insert query
INSERT INTO t1 VALUES('Name',15)

//later on application sends update query for the newly inserted row
UPDATE t1 SET name='NewName', number=16 WHERE id = 10 //this ID is the id of the inserted row.

COMMIT

给定的代码与我在应用程序中使用的代码不完全相同,但想法是相同的,只是有更多列。

表t1有主键ID,一些非聚集索引。

同时运行其中两个事务后,它会死锁。探查器表示死锁查询是这个 UPDATE t1 SET name='NewName', number=16 WHERE id = :id对于每个冲突的进程。

抱歉,我没有死锁的 XML,但分析器告诉我两个进程都有 X 锁,并且都尝试获取 U 锁。

process 1
owner - X
waiter - U

process 2
owner - X
waiter - U

t1两个进程的表均显示为对象,PK_id 索引显示为 indexname .

那么这里到底发生了什么?每个事务更新同一个表中的不同行,为什么会死锁?

网上的许多示例都说“嘿,这是因为它扫描索引的方式,它扫描一个事务的 pk 索引和另一个事务的其他非聚集索引”,但它们的探查器死锁图在 indexname 下显示不同的值。 ,所以这与我所拥有的不一样,索引名称是相同的。

有什么想法可以解决这个问题吗?这让我疯狂。我认为启用 read_commited_snapshot 可以解决这个问题,但我错了。

最佳答案

最有可能的是,您的一个或两个更新使用表/聚集索引扫描来查找要更新的行 - 这通常会导致死锁。检查执行计划。

关于sql-server - 更新单个表上的两个不同行时发生死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8900440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com