Postgresql锁死锁

时间:2010-10-19 15:39:49

标签: django postgresql

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

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

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

我无法理解的是为什么它首先发生。如果postgresql已经有一个覆盖那个隐式锁的显式锁,为什么要求隐式锁呢?我无法理解的第二件事是为什么这个视图在2个不同的postregsql进程上运行?他们不应该在一次交易中被收集吗?

提前完成。

1 个答案:

答案 0 :(得分:1)

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

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

根据您的描述,您需要可重复读取隔离级别。