如何处理Django-PostgreSQL锁

时间:2014-10-15 10:36:05

标签: django postgresql locking celery

我在使用postgresql后端的Django项目时遇到了问题。

我知道在“网络交易”中存在一些未解决的问题。每次执行select时,都会在postgresql中创建一个新锁。这种锁在网络交互中很好(请求 - 处理 - 响应)

这似乎是一个问题,我在芹菜整合方面遇到了一些麻烦。我的一些任务执行时间太长,而且它们如下:

l1. instances = mymodels.MyModel.objects.all()
l2. for instance in instances:
l3.     do something with that instance (not update, just performing 
l4.     some operations from instance fields)

锁定仅在该任务结束时释放。在“l1”之后生成的锁是否有任何释放方式?

我的postgres锁定表的输出

SELECT locktype, relation::regclass, mode, transactionid AS tid,
virtualtransaction AS vtid, pid, granted
FROM pg_catalog.pg_locks l LEFT JOIN pg_catalog.pg_database db
ON db.oid = l.database WHERE (db.datname = 'sandbox' OR db.datname IS NULL)
AND NOT pid = pg_backend_pid();


  locktype  | relation |     mode      | tid | vtid  |  pid  | granted 
------------+----------+---------------+-----+-------+-------+---------
 virtualxid |          | ExclusiveLock |     | 3/427 | 47715 | t
(1 row)

提前谢谢你,

1 个答案:

答案 0 :(得分:1)

似乎这是Django的一部分 - 驱动程序行为,没有明确设置自动提交。使用autocommit = True,所有查询在评估时开始和结束。

我知道在查询+更新方面它并不安全,但大部分时间,查询只是...查询

干杯