为什么 NOLOCK 是这样实现的?

Dim*_*las 5 sql-server concurrency transaction nolock

最近我NOLOCK在 SQL Server 中搜索了选项。我发现当事务在表上处于活动状态时,SQL Server 甚至不允许从特定表中读取,直到事务提交或回滚(据我了解,何时应该使用“with ( nolock)” )。

同时,其他 RDBMS(例如 PostgreSQL)允许您从具有活动写入事务的行读取值。他们只会给你写之前的价值观。特别是这似乎是 PostgreSQL MVCC 的行为(正如我从第 13 章介绍中了解到的。并发控制)。

我有这个迫切的问题。为什么在 SQL Server 中存在死锁的可能性,而在其他 RDBMS 中,您只是在写入新值之前获得旧值?

注意:我问是因为我可能理解错误。

Eri*_*ing 10

SQL Server 默认在Read Committed隔离下运行。

如果您希望 SQL Server 的行为更像其他实现,您要寻找的是Read Committed Snapshot Isolation, 或Snapshot Isolation

您可以在此处阅读有关它们的更多信息。

完全披露,我是 Brent Ozar Unlimited 的员工

在严重的生产用途中使用NOLOCKorRead Uncommitted通常不受欢迎,因为它可能允许脏读和其他意外的工件,而修改查询正在进行中。