PostgreSQL相当于SQLServer的NoLock提示

Cer*_*rin 38 postgresql nolock

在SQLServer中,您可以使用语法"(nolock)"来确保查询不会锁定表,或者不会被锁定同一个表的其他查询阻止.例如

SELECT * FROM mytable (nolock) WHERE id = blah
Run Code Online (Sandbox Code Playgroud)

Postgres中的等效语法是什么?我在PG中找到了关于表锁定的一些文档(http://www.postgresql.org/docs/8.1/interactive/sql-lock.html),但它似乎都是关于如何锁定表,而不是确保它没有被锁定.

Fra*_*ens 54

SELECT不会锁定PostgreSQL中的任何表,除非你想要一个锁:

SELECT * FROM tablename FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)

PostgreSQL使用MVCC来最小化锁争用,以便在多用户环境中实现合理的性能.读者不与作家或其他读者发生冲突.

  • 这是错误的,它等同于带有提示“WITH(UPDLOCK)”的显式锁定,但问题是如何获得无锁定!@matthew-wood 的回答更相关。 (4认同)
  • @BogdanMart 这是他用锁进行选择的示例,因为它隐式不锁定。 (4认同)

小智 14

这是一个老问题,但我认为实际问题还没有得到解答。

查询SELECT(不包含子句for update)永远不会锁定任何行(或表),也不会阻止对表的并发访问。并发 DML ( INSERT, UPDATE, DELETE) 也不会阻塞SELECT语句。

简单地说:Postgres 中不需要(nolock)。读者永远不会阻止作家,作家也永远不会阻止读者

  • @serge:不,你根本不需要 Postgres(或 Oracle)中的这个 `(nolock)` 提示。读者永远不会阻止作家,作家也永远不会阻止读者。 (3认同)

Mat*_*ood 12

我做了一些研究,似乎SQL Server中的NOLOCK提示与READ UNCOMMITTED事务隔离级别大致相同.在PostgreSQL中,您可以设置READ UNCOMMITTED,但它会默认将级别升级为READ COMMITTED.不支持READ UNCOMMITTED.

用于事务隔离的PostgreSQL 8.4文档:http://www.postgresql.org/docs/8.4/static/transaction-iso.html

  • 一个小小的引用只是为了突出原因:_ PostgreSQL只提供两个隔离级别的原因是这是将标准隔离级别映射到多版本并发控制架构的唯一合理方法. (7认同)
  • @dezso:+1,但在9.1 SERIALIZABLE中添加了,所以文档已更新为"...提供三个隔离级别......",但在其他方面是相同的. (6认同)