小编Boo*_*ood的帖子

使用非聚集索引更新不同行时出现死锁

我正在解决一个死锁问题,同时我注意到当我在 id 字段上使用聚集和非聚集索引时,锁定行为是不同的。如果将聚集索引或主键应用于 id 字段,则死锁问题似乎已解决。

我有不同的事务对不同的行进行一次或多次更新,例如事务 A 只会更新 ID=a 的行,tx B 只会接触 ID=b 的行等。

而且我了解到,如果没有索引,更新将获取所有行的更新锁,并在必要时转换为排他锁,这最终会导致死锁。但是我没有找到为什么使用非聚集索引,死锁仍然存在(虽然命中率似乎下降了)

数据表:

CREATE TABLE [dbo].[user](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [userName] [nvarchar](255) NULL,
    [name] [nvarchar](255) NULL,
    [phone] [nvarchar](255) NULL,
    [password] [nvarchar](255) NULL,
    [ip] [nvarchar](30) NULL,
    [email] [nvarchar](255) NULL,
    [pubDate] [datetime] NULL,
    [todoOrder] [text] NULL
)
Run Code Online (Sandbox Code Playgroud)

死锁跟踪

deadlock-list
deadlock victim=process4152ca8
process-list
process id=process4152ca8 taskpriority=0 logused=0 waitresource=RID: 5:1:388:29 waittime=3308 ownerId=252354 transactionname=user_transaction lasttranstarted=2014-04-11T00:15:30.947 XDES=0xb0bf180 lockMode=U schedulerid=3 kpid=11392 status=suspended spid=57 sbid=0 ecid=0 priority=0 trancount=2 lastbatchstarted=2014-04-11T00:15:30.953 lastbatchcompleted=2014-04-11T00:15:30.950 lastattention=1900-01-01T00:00:00.950 clientapp=.Net SqlClient Data …
Run Code Online (Sandbox Code Playgroud)

index sql-server locking

13
推荐指数
1
解决办法
3万
查看次数

标签 统计

index ×1

locking ×1

sql-server ×1