【发布时间】:2012-02-06 10:13:12
【问题描述】:
我创建了一个 Django/Tastypie 应用程序,其中多个人可能会同时更改数据库中一行的属性,或者可能 PUT 过时的数据。
例如:
# the Django model
class Thing(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
# the Tastypie Resource
class ThingResource(ModelResource):
class Meta:
queryset = Thing.objects.all()
现在假设任意数量的用户可以随时更改Thing 的name 或description。他们可以同时进行,或者有人可以让应用程序打开很长时间,然后再回来更改它。
我要避免的是不正确的潜在更改。鉴于以下情况:
#1 User 1: Opens app viewing Thing #1 with name = "my name", description = "my description"
#2 User 2: Opens app viewing Thing #1 (same state as User 1)
#3 User 2: Changes description of Thing #1 to "something"
#4 User 1: Changes name of Thing #1 to "some other name"
在#4 行之后,事物#1 的状态应该是name = "some other name", description = "something" 而不是name = "some other name", description = "my description"。
假设应用程序不提前知道(实时或通过定期更新页面上的数据)服务器上的对象已更改,如何防止这种情况发生?
我考虑添加一个字段sequence = models.PositiveIntegerField(),每次更新时我都会在其中增加它,这样我就可以在更新发生时判断对象是否已过期,但这是最好的方法吗?有没有更好的办法?这似乎是一种常见的模式,对吧?
【问题讨论】:
-
保留版本号是一种被广泛接受的良好做法。您当然应该在后端使用某种事务性数据库,否则任何此类方案都无法确保正确的行为。
-
是的,我正在使用 PostgreSQL。感谢您指出这一点
标签: javascript django http rest tastypie