为什么 Oracle 没有 nolock?

sal*_*sal 16 oracle sql-server

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

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

Bri*_*nge 23

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

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

在 Oracle 中,读进程永远不会阻塞写进程。以下摘自“ Oracle 数据库概念 11g 第 2 版”。如果您对 Oracle 如何处理此问题感兴趣,我鼓励您查看一下。

数据并发和一致性

锁定行为总结

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

锁会影响读者和作者的交互。读者是对资源的查询,而作者是修改资源的语句。以下规则总结了 Oracle 数据库对读写器的锁定行为:

• 一行只有在被作者修改时才被锁定。

当语句更新一行时,事务只为这一行获取锁。通过在行级别锁定表数据,数据库最大限度地减少了对相同数据的争用。通常情况下 1 数据库不会将行锁升级到块级或表级。

• 一行的写者阻塞同一行的并发写者。

如果一个事务正在修改一行,那么行锁可以防止不同的事务同时修改同一行。

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

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

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

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