在 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 )中找到了一些关于表锁定的文档,但这一切似乎都是针对如何锁定表,而不是确保它没有被锁定.
SELECT 不会锁定 PostgreSQL 中的任何表,除非您想要锁定:
SELECT * FROM tablename FOR UPDATE;
PostgreSQL 使用MVCC来最小化锁竞争,以便在多用户环境中实现合理的性能。读者不会与作者或其他读者发生冲突。
我做了一些研究,似乎 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
这是一个老问题,但我认为实际问题尚未得到解答。
SELECT 查询(不包含for update
子句)永远不会锁定任何行(或表),也不会阻止对表的并发访问。并发 DML(INSERT、UPDATE、DELETE)也不会阻塞 SELECT 语句。
(nolock)
简单地说:在 Postgres 中不需要。读者从不阻止作者,作者从不阻止读者
nolock 或 readpast 的目的是查看记录是否被当前锁定。用户可以在更新中使用它来查看标识的记录是否已更改(行受影响);如果记录未被锁定,则 therowsaffected 将为 1;如果为o,则记录被锁定
根据该结果,用户可以使用 select for update 将其锁定以供自己使用。
每个 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(*) 除非你真的需要它