在SQLServer中,您可以使用语法“(nolock)”来确保查询不会锁定表,或者不会被锁定同一个表的其他查询阻止。 e.g。
SELECT * FROM mytable (nolock) WHERE id = blah
Postgres中的等效语法是什么?我在PG(http://www.postgresql.org/docs/8.1/interactive/sql-lock.html)中找到了关于表锁定的一些文档,但它似乎都是如何锁定表,而不是确保未锁定。 / p>
答案 0 :(得分:50)
SELECT不会锁定PostgreSQL中的任何表,除非您想要锁定:
SELECT * FROM tablename FOR UPDATE;
PostgreSQL使用MVCC来最小化锁争用,以便在多用户环境中实现合理的性能。读者不与作家或其他读者发生冲突。
答案 1 :(得分:9)
我做了一些研究,似乎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
答案 2 :(得分:0)
nolock或readpast的目的是查看记录是否被当前锁定。用户可以在更新中使用它来查看所标识的记录是否已更改(受行影响);如果记录未锁定,则受影响的人数为1;如果为o,则记录已锁定
根据该结果,用户可以使用select进行更新以将其锁定以供自己使用。