Postgresql锁死锁

3
我正在使用Django + Postgresql开发一个系统。虽然这是我第一次使用Postgresql,但我选择它是因为我需要事务和外键功能。
在某个视图中,我必须使用AccessExclusiveLock锁定我的表,以防止在此视图期间进行任何读取或写入。这是因为在保存/更新实体之前,我会对整个数据进行一些检查。
我注意到有时会出现不一致的错误。这是由于在锁定语句之后直接发生的select语句。它要求具有AccessShareLock。我在Postgresql的网站上阅读到AccessShareLock与AccessExclusiveLock冲突。
我不明白的是为什么会发生这种情况。如果已经有覆盖该隐式锁的显式锁,为什么Postgresql还会要求隐式锁呢?我不理解的第二件事是为什么这个视图在2个不同的postregsql进程上运行?它们不应该被收集在单个事务中吗?
谢谢。

你能提供一个导致这个问题的例子吗?比如一个可行的例子。 - Kuberchaun
1
有点偏离主题:不要使用“developer.postgresql.org”上的文档 - 它们适用于下一个尚未发布的版本的Postgres。 - Milen A. Radev
@StarShip3000,恐怕我不能这样做。这是专有的垃圾。 - thelinuxer
伪代码或一个工作的代码示例,模仿您的代码但不包含专有内容。 - Kuberchaun
1个回答

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

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

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

2
根据这里的内容 https://dev59.com/2kzSa4cB1Zd3GeqPjAgl ,我猜无法使用Django ORM设置事务隔离级别。 - thelinuxer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接