在SQLServer中,可以使用语法“(nolock)”来确保查询不会锁定表,或者不会被锁定同一表的其他查询阻塞。例如
SELECT * FROM mytable (nolock) WHERE id = blah
Postgres中的等效语法是什么?我在PG(http://www.postgresql.org/docs/8.1/interactive/sql-lock.html)中找到了一些关于表锁定的文档,但似乎都是针对如何锁定表,而不是确保它没有被锁定。
在SQLServer中,可以使用语法“(nolock)”来确保查询不会锁定表,或者不会被锁定同一表的其他查询阻塞。例如
SELECT * FROM mytable (nolock) WHERE id = blah
Postgres中的等效语法是什么?我在PG(http://www.postgresql.org/docs/8.1/interactive/sql-lock.html)中找到了一些关于表锁定的文档,但似乎都是针对如何锁定表,而不是确保它没有被锁定。
5条答案
按热度按时间blmhpbnm1#
SELECT不会锁定PostgreSQL中的任何表,除非你想要一个锁:
PostgreSQL使用MVCC来最小化锁争用,以便在多用户环境中提供合理的性能。读者不与作者或其他读者发生冲突。
uz75evzq2#
我做了一些研究,似乎SQL Server中的
NOLOCK
提示与READUNCOMMITTED
事务隔离级别大致相同。在PostgreSQL中,您可以设置READ UNCOMMITTED
,但它会悄悄地将级别升级到READ COMMITTED
。不支持READ UNCOMMITTED
。PostgreSQL 8.4事务隔离文档:http://www.postgresql.org/docs/8.4/static/transaction-iso.html
dw1jzc5e3#
这是一个老问题,但我认为实际的问题还没有得到回答。
SELECT
查询(不包含for update
子句)永远不会锁定任何行(或表),也不会阻止对表的并发访问。并发DML(INSERT, UPDATE, DELETE
)也不会阻止SELECT
语句。简单地说:在Postgres中不需要
(nolock)
。读者从不阻挡作者,作者也从不阻挡读者tag5nh1u4#
nolock或readpast的目的是查看记录当前是否被锁定。用户可以在更新中使用它来查看标识的记录是否被更改(rowaffected);如果记录未锁定,则受影响的值为1;如果是,则记录被锁定
基于该结果,然后用户可以使用选择更新来锁定它以供他们自己使用。
py49o6xq5#
每个SQL语句都是一个隐式事务。
NOLOCK
提示对应于READ UNCOMMITTED
(DIRTY READ
)transaction isolation level。实际上,这段代码与
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED
做的是一样的,但进一步保证了预期的行为。另外,除非你真的需要,否则不要使用COUNT(*)