Answers:
SQL Server通常使用与Oracle不同的锁定策略。SQL Server使用的默认策略意味着选择行会导致将读取锁(在行,页面或整个表上)*。因此,NOLOCK
有时它是一个有用的子句-尽管一般建议不要使用它,因为它会更改隔离级别的语义,并可能导致查询输出不一致的结果。
*(注意:这是默认设置。如果SNAPSHOT
选择了隔离,则行为会有所不同,并且读取器不会阻止写入器。)
在Oracle中,读取过程将永远不会阻止写入过程。以下摘录自“ Oracle Database Concepts 11g第2版 ”。如果您对Oracle如何处理它感兴趣,我建议您看看。
锁定行为摘要
数据库维护几种不同类型的锁,具体取决于获取锁的操作。通常,数据库使用两种类型的锁:排他锁和共享锁。在诸如行或表之类的资源上只能获得一个排他锁,但是在单个资源上可以获得许多共享锁。
锁会影响读者和作家的互动。读者是对资源的查询,而作家是对资源的声明。以下规则总结了针对读者的Oracle数据库的锁定行为:
•仅当由编写者修改时,行才被锁定。
当一条语句更新一行时,该事务仅获取该行的锁。通过将表数据锁定在行级别,数据库可以最大程度地减少对同一数据的争用。在正常情况下1,数据库不会将行锁升级为块或表级别。
•行的写作者阻止同一行的并发写者。
如果一个事务正在修改一行,则行锁可防止其他事务同时修改同一行。
•读者永远不会阻止作家。
因为行的阅读器不会锁定它,所以写者可以修改该行。唯一的例外是SELECT ... FOR UPDATE语句,这是SELECT语句的一种特殊类型,它确实锁定正在读取的行。
•作家永远不会阻止读者。
当编写器更改一行时,数据库使用撤消数据为读取器提供该行的一致视图。