SQL Server 选择计数 READ_COMMITTED_SNAPSHOT 问题

gra*_*l8d 8 sql-server-2008 sql-server deadlock isolation-level

在特定表上执行 select count(*) 时,我似乎遇到了很多死锁。我已经更改了所有必需的参数并将它们设置为仅行锁定。

我还更改了数据库以使用 READ_COMMITTED_SNAPSHOT 隔离,

但是,似乎使用 select count(*) where column = ? 在桌子上触发死锁或桌子上的锁..

我是否正确地认为 select count(*) 应该只访问中间行?但是,似乎并非如此,我仍然遇到死锁。适当的索引可能会有所帮助,

问题是:即使 read_committed_snapshot 设置为 on,SQL Server 2008 R2 是否在 select count(*) 期间在表上放置共享锁?

谢谢

mrd*_*nny 0

快照隔离的锁定不会改变。发生的变化是,当您更改页面时,这些页面将复制到 tempdb 数据库,以便您可以从 tempdb 数据库而不是从普通数据库读取它们。(是的,这是正在发生的事情的简化版本。)

您提到您没有适当的索引,因此您正在进行聚集索引扫描(如果是堆,则进行表扫描)。这可能有大量数据要移动到 tempdb 数据库。如果此查询将运行多次,我建议将索引添加到表中。

您的查询使用什么隔离级别?