58

在 SQLServer 中,您可以使用语法“(nolock)”来确保查询不会锁定表或不会被锁定同一表的其他查询阻塞。例如

SELECT * FROM mytable (nolock) WHERE id = blah

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

4

5 回答 5

81

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

SELECT * FROM tablename FOR UPDATE;

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

于 2010-03-07T00:13:12.447 回答
27

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

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

于 2010-03-07T17:33:22.333 回答
1

这是一个老问题,但我认为实际问题尚未得到解答。

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

(nolock)简单地说:在 Postgres 中不需要。读者从不阻止作者,作者从不阻止读者

于 2022-03-02T12:59:23.593 回答
0

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

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

于 2020-07-17T19:21:45.003 回答
-1

每个 SQL 语句都是一个隐式事务。该NOLOCK提示对应于READ UNCOMMITTED( DIRTY READ)事务隔离级别

BEGIN TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT COUNT(1) FROM my_table;
END;

实际上,这段代码的作用相同,BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED但进一步保证了预期的行为。

也避免使用 COUNT(*) 除非你真的需要它

于 2022-03-02T12:08:02.140 回答