2011-02-04 33 views
2

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

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

+0

似乎是一个非常奇怪的设计的Web应用程序。你介意解释为什么MVCC不适合你吗? – 2011-02-04 19:07:47

回答

2

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

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

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