应该覆盖哪些方法来实现Django中的自动锁定和解锁记录

时间:2011-02-04 18:57:24

标签: python django postgresql concurrency locking

如何在Django中修改模型的行为,以便在选择它们时在数据库中执行自动锁定和解锁记录,并使程序员的这种行为透明化?我已经知道如何锁定和解锁记录(database record locking),但我们想知道这些代码应放在Django模型中的哪个位置。我希望它适用于所有all(),filter(),exclude()和其他查询,并且应该在save()时以及在我们不保存任何内容的查询中调用解锁。

UPDATE :此应用程序有多个线程可以同时由两个或多个服务器运行,我想确保不会有多个线程处理来自公共数据库的记录。线程搜索一些记录,然后通过套接字发送一些数据,最后更新这些记录。换句话说,除了Django网站之外还有服务器。

1 个答案:

答案 0 :(得分:2)

您希望在模型__init__()期间获取锁定;这可以通过继承相当简单地实现。模型的Manager将为该模型实例化QuerySet,只要将检索到的模型添加到查询_result_cache[]或查询的iterator(),就会获得锁定叫做。当然,您必须确保如果模型没有关联的pk,那么您放弃了锁定争用。

如果您不想进行数据库级锁定,可以查看Django-cachebot。它处理模型失效,但最重要的是它可以将模型记录保存在线程的公共存储中,因此您可以实现模型锁定状态并将其推送到存储并由其他线程查询。

我也有这种冲动,为了一个奇怪的问题,给你一个大问题。我不会在家里试试这个,所以我真诚地希望你知道你在做什么!