gpt4 book ai didi

sql-server - 主键上的 SELECT/UPDATE 死锁

转载 作者:行者123 更新时间:2023-12-05 00:23:47 31 4
gpt4 key购买 nike

我的 MS SQL Server 2008 数据库中有 2 个表:

[Person]
-Id
-Name
-Car_Id

和:

[Car]
-Id
-Mileage

现在我有一个正在运行的服务器进程,它不断更新不同汽车的里程数。

UPDATE Car SET Mileage=1234 WHERE Id=7

然后我有一个客户有一个网格,显示人员和他们的汽车里程数。这也是定期更新的:

SELECT p.Name, c.Mileage
FROM Person AS p
INNER JOIN Car AS c on p.Car_Id = c.Id

现在这经常会导致我的 Car 表的主键出现死锁: enter image description here

然后 SELECT 查询被 SQL 服务器中止。据我了解,这与主键上的某种范围锁定有关。一个由 UPDATE WHERE 子句引起,另一个由 INNER JOIN 条件引起。

这个假设是否正确?

这种键锁死锁问题的首选解决方案是什么?我认为解决它的唯一方法是重试 SELECT,或更改事务隔离级别。我不想在没有完全理解这里的问题的情况下就降低隔离级别。

编辑

有关表格的更多详细信息:

CREATE TABLE [dbo].[Car](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Mileage] [int] NULL,
CONSTRAINT [PK_dbo.Car] PRIMARY KEY CLUSTERED

CREATE TABLE [dbo].[Person](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](max) NULL,
[Car_Id] [int] NULL,
CONSTRAINT [PK_dbo.Person] PRIMARY KEY CLUSTERED

ALTER TABLE [dbo].[Person] WITH CHECK ADD CONSTRAINT [FK_dbo.Person_dbo.Car_Car_Id] FOREIGN KEY([Car_Id])
REFERENCES [dbo].[Car] ([Id])

ALTER TABLE [dbo].[Person] CHECK CONSTRAINT [FK_dbo.Person_dbo.Car_Car_Id]

CREATE NONCLUSTERED INDEX [IX_Car_Id] ON [dbo].[Person]
(
[Car_Id] ASC
)

编辑2

我刚刚想到的一件事在这里可能也很重要:服务器端一个事务中总是有多个UPDATE,所以并不是每个UPDATE都在一个事务中。基本上所有更改的汽车都在一次交易中更新。

最佳答案

事实证明,在事务中只运行一个 UPDATE 即可解决问题。感谢大家的投入。

关于sql-server - 主键上的 SELECT/UPDATE 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34910569/

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