PostgreSQL相当于SQLServer';诺洛克暗示

PostgreSQL相当于SQLServer';诺洛克暗示,postgresql,nolock,Postgresql,Nolock,在SQLServer中,可以使用语法“(nolock)”来确保查询不会锁定表,或者不会被锁定同一表的其他查询阻止。 e、 g Postgres中的等效语法是什么?我在PG()中找到了一些关于表锁定的文档,但这些文档似乎都是针对如何锁定表,而不是确保表未被锁定。SELECT不会锁定PostgreSQL中的任何表,除非您需要锁定: SELECT * FROM tablename FOR UPDATE; PostgreSQL用于最小化锁争用,以便在多用户环境中实现合理的性能。读者不会与作者或其他读者

在SQLServer中,可以使用语法“(nolock)”来确保查询不会锁定表,或者不会被锁定同一表的其他查询阻止。 e、 g


Postgres中的等效语法是什么?我在PG()中找到了一些关于表锁定的文档,但这些文档似乎都是针对如何锁定表,而不是确保表未被锁定。

SELECT不会锁定PostgreSQL中的任何表,除非您需要锁定:

SELECT * FROM tablename FOR UPDATE;

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

我做了一些研究,发现SQL Server中的
NOLOCK
提示与READ
UNCOMMITTED
事务隔离级别大致相同。在PostgreSQL中,您可以设置
readuncommitted
,但它会自动将级别升级为
readcommitted
<不支持代码>读取未提交的


用于事务隔离的PostgreSQL 8.4文档:

nolock或readpast的目的是查看记录是否当前锁定。用户可以在更新中使用它来查看标识的记录是否已更改(rowsaffected);如果记录未被锁定,则受影响的rows将为1;如果为o,则记录被锁定


根据该结果,用户可以使用select for update将其锁定供自己使用。

等等,让我看看我是否理解这一点。有一个选项可以忽略表上的锁???如果是真的,那么在验证新约束时可以忽略现有行,这是一个坏主意。@Matthew Wood:一般来说,我倾向于同意。但是,忽略锁对于某些情况是有用的,比如当您想要检查一个表的内容时调试,即使它在一个非常大的更新的中间。忽略锁比等待几分钟/小时以完成更新更可取。用一个小引号来强调原因:PostgreSQL只提供两个隔离级别的原因是,这是将标准隔离级别映射到多版本并发控制体系结构的唯一合理方法。@dezso:+1,但在9.1中添加了SERIALIZABLE,所以文档被更新为“…提供三个隔离级别…”,但在其他方面是相同的。这是错误的,它相当于使用(UPDLOCK)的提示显式锁定,但问题是如何不获得锁定@马修·伍德的回答更为贴切。@BogdanMart这是他用锁进行选择的例子,因为它隐式地不锁。问题是知道什么是Postgres的等价物,而不是nolock的目的是什么。
SELECT * FROM tablename FOR UPDATE;