我創建了一個Django/Tastypie應用程序,其中多個人可能在同一時間更改數據庫中某一行的屬性,或者可能是過時的PUT數據。是否有一種確保一次只有一個用戶使用REST + HTTP更改對象的正確方法?
例如:
# 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()
,每次更新時我都會增加一個字段,所以我可以告訴對象是否在更新發生時過時,但這是最好的方法嗎?有沒有更好的辦法?這似乎是一種常見的模式,對嗎?
保留版本號是一個被廣泛接受的良好做法。你當然應該在後端使用某種事務數據庫,否則沒有這樣的方案可以確保正確的行爲。 – Pointy 2012-01-09 22:11:42
是的,我正在使用PostgreSQL。感謝您指出,雖然 – dlamotte 2012-01-10 14:22:48