Rainbolt Asked: 2020-04-08 10:04:45 +0800 CST2020-04-08 10:04:45 +0800 CST 2020-04-08 10:04:45 +0800 CST 强制更新语句以相同的顺序获取页面锁? 772 我在同一张表上有两个更新语句,它们以不同的顺序获取页面锁。这会导致死锁。 进程 A 在第 1 页拥有更新锁,并在第 2 页请求更新锁。 进程 B 拥有第 2 页的更新锁,并希望获得第 1 页的更新锁。 如何强制两个语句以相同的顺序获取页锁? sql-server sql-server-2014 2 个回答 Voted Best Answer David Browne - Microsoft 2020-04-08T10:16:37+08:002020-04-08T10:16:37+08:00 如何强制两个语句以相同的顺序获取页锁? 你不能。而是强制它们都使用带有 TABLOCKX 提示的表锁,或者使用应用程序锁来序列化会话。 Michael Green 2020-04-08T13:04:20+08:002020-04-08T13:04:20+08:00 您可以在 SQL 语句中强制页面访问顺序。您可能能够为具有相同访问顺序的每个查询找到一个计划,然后应用计划指南。IIRC 这只是一个建议,执行引擎可能不会在运行时使用它。 这些页面被访问和锁定,因为这些页面上的行被锁定。如果您可以强制触摸行的顺序,也许是通过光标,那将解决这个问题。当然,您现在还有其他问题。 大概这两个查询没有触及相同的行。SQL Server 支持行锁。您必须相应地定义表和索引。
你不能。而是强制它们都使用带有 TABLOCKX 提示的表锁,或者使用应用程序锁来序列化会话。
您可以在 SQL 语句中强制页面访问顺序。您可能能够为具有相同访问顺序的每个查询找到一个计划,然后应用计划指南。IIRC 这只是一个建议,执行引擎可能不会在运行时使用它。
这些页面被访问和锁定,因为这些页面上的行被锁定。如果您可以强制触摸行的顺序,也许是通过光标,那将解决这个问题。当然,您现在还有其他问题。
大概这两个查询没有触及相同的行。SQL Server 支持行锁。您必须相应地定义表和索引。