Sql server 我们可以控制SQL Server中锁的顺序吗?

Sql server 我们可以控制SQL Server中锁的顺序吗?,sql-server,deadlock,Sql Server,Deadlock,这是我的场景,我有这样一个表: CREATE TABLE [MyTable] ( [Id] BIGINT PRIMARY KEY, [Value] NVARCHAR(100) NOT NULL, [IndexColumnA] NVARCHAR(100) NOT NULL, [IndexColumnB] NVARCHAR(100) NOT NULL ) CREATE INDEX [IX_A] ON [MyTable] ([IndexColumnA]) CREATE INDE

这是我的场景,我有这样一个表:

CREATE TABLE [MyTable]
(
   [Id] BIGINT PRIMARY KEY,
   [Value] NVARCHAR(100) NOT NULL,
   [IndexColumnA] NVARCHAR(100) NOT NULL,
   [IndexColumnB] NVARCHAR(100) NOT NULL
)
CREATE INDEX [IX_A] ON [MyTable] ([IndexColumnA])
CREATE INDEX [IX_B] ON [MyTable] ([IndexColumnB])
并且有两个使用两个不同更新命令的用例

UPDATE [MyTable] SET [Value] = '...' WHERE [IndexColumnA] = '...'

这两个update命令都可以更新多行,并且这些命令在并发执行时会导致死锁

我的推测是,两个update命令在扫描行时使用不同的索引,因此在行上放置锁的顺序不同。因此,一个更新命令可能会尝试在另一个更新命令已放置X锁的行上放置U锁。(我不是数据库专家,如果我错了,请纠正我)

一种可能的解决方案是强制数据库以相同的顺序放置锁。根据,我们似乎可以通过
选择。。。订购人。。。用于PostgreSQL中的更新


我们可以(也应该)在SQL Server中这样做吗?如果没有,唯一的解决办法是处理应用程序代码中的死锁吗?

@DaleK谢谢,我知道我们可以用
和(updlock)
放置U锁。但是,我不确定是否将它与
按顺序使用会强制数据库按所需顺序锁定,以及使用它是否是处理死锁的好方法。顺便说一句,我注意到您尚未接受任何问题的答案?有什么原因吗?你的链接是关于两个表和单行的场景,而我的案例是关于单表和多行的,它们并不完全相同。原因只是我不知道我们可以接受答案。谢谢提醒。我知道所有死锁原则上都是一样的,但我想问的是如何处理由两个独立用例引起的死锁。我只是无法锁定由另一个更新命令更新的行。
UPDATE [MyTable] SET [Value] = '...' WHERE [IndexColumnB] = '...'