【问题标题】:Postgresql locks deadlockPostgresql 锁死锁
【发布时间】:2010-10-19 15:39:49
【问题描述】:

我正在使用 Django + Postgresql 开发一个系统。这是我第一次使用 postgresql,但我选择它是因为我需要事务和外键功能。

在某个视图中,我必须使用 AccessExclusiveLock 锁定我的表,以防止在此视图期间进行任何读取或写入。那是因为我在保存/更新我的实体之前对整个数据进行了一些检查。

我注意到不时发生不一致的错误。这是因为 select 语句直接发生在 lock 语句之后。它要求有 AccessShareLock。我在 postgresql website 上读到 AccessShareLock 与 AccessExclusiveLock 冲突。

我不明白为什么会发生这种情况。如果 postgresql 已经有一个覆盖隐式锁的显式锁,为什么它会要求隐式锁?我不明白的第二件事是为什么这个视图在 2 个不同的 postregsql 进程上运行?它们不应该在一次交易中收集吗?

提前感谢。

【问题讨论】:

  • 您能否提供导致此问题的示例?例如一个工作示例。
  • 有点 OT:不要使用“developer.postgresql.org”上的文档 - 下一个尚未发布的 Postgres 版本。
  • @StarShip3000 恐怕我做不到。专有废话。
  • 伪代码或工作代码示例,可以模仿您的代码而没有专有废话。

标签: django postgresql


【解决方案1】:

在 PostgreSQL 中,我建议您在会话中设置适当的事务隔离级别,而不是获取独占访问锁。因此,在运行“更新”之前,将以下命令发送到您的数据库:

begin;
set transaction isolation level repeatable read;
-- your SQL commands here
commit;

根据你的描述,你需要repeatable read隔离级别。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 2021-07-02
  • 2020-01-11
  • 2012-05-01
  • 1970-01-01
  • 2017-05-04
  • 2015-10-26
相关资源
最近更新 更多