为什么Oracle没有nolock?


14

在MS SQL Server nolock中可以用于此目的。

为什么我们不能在Oracle和plsql中使用它?

Answers:


21

SQL Server通常使用与Oracle不同的锁定策略。SQL Server使用的默认策略意味着选择行会导致将读取锁(在行,页面或整个表上)*。因此,NOLOCK有时它是一个有用的子句-尽管一般建议不要使用它,因为它会更改隔离级别的语义,并可能导致查询输出不一致的结果。

*(注意:这是默认设置。如果SNAPSHOT选择了隔离,则行为会有所不同,并且读取器不会阻止写入器。)

在Oracle中,读取过程将永远不会阻止写入过程。以下摘录自“ Oracle Database Concepts 11g第2版 ”。如果您对Oracle如何处理它感兴趣,我建议您看看。

数据并发与一致性

锁定行为摘要

数据库维护几种不同类型的锁,具体取决于获取锁的操作。通常,数据库使用两种类型的锁:排他锁和共享锁。在诸如行或表之类的资源上只能获得一个排他锁,但是在单个资源上可以获得许多共享锁。

锁会影响读者和作家的互动。读者是对资源的查询,而作家是对资源的声明。以下规则总结了针对读者的Oracle数据库的锁定行为:

•仅当由编写者修改时,行才被锁定。

当一条语句更新一行时,该事务仅获取该行的锁。通过将表数据锁定在行级别,数据库可以最大程度地减少对同一数据的争用。在正常情况下1,数据库不会将行锁升级为块或表级别。

•行的写作者阻止同一行的并发写者。

如果一个事务正在修改一行,则行锁可防止其他事务同时修改同一行。

•读者永远不会阻止作家。

因为行的阅读器不会锁定它,所以写者可以修改该行。唯一的例外是SELECT ... FOR UPDATE语句,这是SELECT语句的一种特殊类型,它确实锁定正在读取的行。

•作家永远不会阻止读者。

当编写器更改一行时,数据库使用撤消数据为读取器提供该行的一致视图。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.