【问题标题】:PostgreSQL Locking QuestionsPostgreSQL 锁定问题
【发布时间】:2011-02-18 19:49:18
【问题描述】:

我试图弄清楚如何锁定整个表以防止在 Postgres 中写入,但它似乎不起作用,所以我假设我做错了什么。

例如,表名是“用户”。

在独占模式下锁定 TABLE 用户;

当我查看 pg_locks 视图时,它似乎并不存在。我也尝试了其他锁定模式,但无济于事。

其他事务也能够执行 LOCK 功能,并且不会像我想象的那样阻塞。

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

任何帮助都会很棒。

【问题讨论】:

  • 为什么要锁表?

标签: sql postgresql locking


【解决方案1】:

SQL 标准中没有 LOCK TABLE,而是使用 SET TRANSACTION 来指定事务的并发级别。您应该能够在像这样的事务中使用 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;

我实际上在我的数据库上对此进行了测试。

【讨论】:

  • 请注意,access exclusive mode 阻止任何其他进程甚至从表中读取,而不仅仅是写入表。您可以使用share row exclusive mode 专门针对其他运行更新或插入的进程锁定表。
【解决方案2】:

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

(在 9.0 中出现错误:“LOCK TABLE can only be used in transaction blocks”。8.1 非常旧)

【讨论】:

  • 好吧,我真是太傻了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多