2010-10-19 172 views
3

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

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

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

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

Thanx提前。

+0

你能提供导致这个问题的例子吗?如一个工作示例。 – Kuberchaun 2010-10-19 15:45:07

+1

OT:不要在“developer.postgresql.org”使用文档 - 有Postgres的下一个但尚未发布的版本。 – 2010-10-19 18:16:24

+0

@ StarShip3000恐怕我做不到。专有的废话。 – thelinuxer 2010-10-20 13:07:55

回答

1

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

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

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

+2

我想accorging这个http://stackoverflow.com/questions/2280779/django-transaction-isolation-level-in-mysql-postgresql我不能使用Django ORM设置事务隔离级别。 – thelinuxer 2010-10-20 12:58:18