2011-02-18 74 views
2

我想弄清楚如何锁定整个表在Postgres中编写,但它似乎并没有工作,所以我假设我做错了什么。PostgreSQL锁问题

表名是'用户'例如。

LOCK TABLE users IN EXCLUSIVE MODE;

当我检查视图pg_locks它似乎并不在那里。我试过其他的锁定模式也无济于事。

其他交易也能够执行LOCK功能,并且不会像我认为的那样阻止。

在psql工具(8.1)中,我只需返回LOCK TABLE。

任何帮助将是美好的。

+1

为什么要锁定表格? – 2011-02-18 20:14:24

回答

9

有一个在SQL标准,而不是使用SET TRANSACTION来指定没有LOCK TABLE事务的并发级别。你应该能够在这样的交易中使用LOCK

BEGIN WORK; 
LOCK TABLE table_name IN ACCESS EXCLUSIVE MODE; 
SELECT * FROM table_name WHERE id=10; 
Update table_name SET field1=test WHERE id=10; 
COMMIT WORK; 

我实际上已经在我的db上测试过了。

+1

请注意,“访问独占模式”可以防止任何其他进程从表中读取数据,而不仅仅是写入数据。您可以使用`共享行独占模式'将表锁定为针对运行更新或插入的其他进程。 – araqnid 2011-03-10 11:13:33

4

请记住,“锁定表”只能持续到事务结束。所以它是无效的,除非你已经在psql中发布了“begin”。

(在9.0这给出了一个错误:“LOCK TABLE只能在事务块中使用” 8.1已经很老了。)

+0

好吧,那只是我的愚蠢。谢谢! – jreid42 2011-02-18 19:56:09