PostgreSQL相当于SQLServer的NoLock提示

xpszyzbs  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(5)|浏览(722)

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

SELECT * FROM mytable (nolock) WHERE id = blah

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

blmhpbnm

blmhpbnm1#

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

SELECT * FROM tablename FOR UPDATE;

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

uz75evzq

uz75evzq2#

我做了一些研究,似乎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

dw1jzc5e

dw1jzc5e3#

这是一个老问题,但我认为实际的问题还没有得到回答。
SELECT查询(不包含for update子句)永远不会锁定任何行(或表),也不会阻止对表的并发访问。并发DML(INSERT, UPDATE, DELETE)也不会阻止SELECT语句。
简单地说:在Postgres中不需要(nolock)。读者从不阻挡作者,作者也从不阻挡读者

tag5nh1u

tag5nh1u4#

nolock或readpast的目的是查看记录当前是否被锁定。用户可以在更新中使用它来查看标识的记录是否被更改(rowaffected);如果记录未锁定,则受影响的值为1;如果是,则记录被锁定
基于该结果,然后用户可以使用选择更新来锁定它以供他们自己使用。

py49o6xq

py49o6xq5#

每个SQL语句都是一个隐式事务。NOLOCK提示对应于READ UNCOMMITTEDDIRTY READtransaction isolation level

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

实际上,这段代码与BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED做的是一样的,但进一步保证了预期的行为。
另外,除非你真的需要,否则不要使用COUNT(*)

相关问题