django的离线乐观锁定
django-optimistic-lock的Python项目详细描述
为django模型实现脱机乐观锁[1]。
用法
添加一个VersionField并从VersionedMixin继承。
fromoolimportVersionField,VersionedMixinclassMyModel(VersionedMixin,models.Model):version=VersionField()
每当保存MyModel时,将检查版本以确保 实例自上次获取以来没有更改。如果有 冲突,将引发ConcurrentUpdate异常。
实施
VersionField只是一个整数,它每 保存其模型的时间。VersionedMixin重写_do_update (由save调用以实际执行更新)添加额外的 更新查询的条件-数据库中的版本是 与模型的版本相同。如果匹配,就没有 同时修改。如果它们不匹配,update语句将 不更新任何行,我们知道有人先保存了。
这样生成的sql看起来像:
UPDATE mymodel SET version = version + 1, ... WHERE id = %s AND version = %s
当没有更新行时,我们知道有人赢了,我们需要提高 一个ConcurrentUpdate。
与django-concurrency
比较django-concurrency之前 版本0.7使用SELECT FOR UPDATE来实现版本检查。我 希望避免数据库级锁定,因此django-optimistic-lock添加 更新语句的版本筛选器,如martin fowler[1]所述。
此外,ool采用了比 通过只做一件事(乐观锁定)来实现django并发性 没有任何猴子补丁,中间件,设置变量,管理 类或窗体字段。django并发可能更有意义 如果你想找一些东西来适应 开箱即用。如果您只是想要一个简单的模型,请使用ool 实现并需要处理ui和周围的架构 你自己。
运行测试
make test
[1] | (1, 2)http://martinfowler.com/eaaCatalog/optimisticOfflineLock.html |
[2] | https://code.djangoproject.com/ticket/16649 |