1

私は mongoengine を使用してmongoDBにアクセスしており、楽観的ロック スキームを実装する簡単な方法を探しています。理想的には、ドキュメントに整数フィールドを設定し、 mongodb ドキュメントversionで説明されているように、ドキュメントが変更されるたびに値を増やしたいと考えています。ドキュメント オブジェクトの現在のバージョンが mongodb 内のドキュメントのバージョンと一致しない場合、ドキュメントの保存は失敗します。

私はmongoengineで少し迷っています。これまでのところ、これを実装しました。動作しますが、常にオブジェクトをリロードする必要があり、これは最適とは言えません。もっと良いアイデアはありますか?

class OptimisticLockException(Exception):
    pass

class TodoList(Document):
    name = StringField()
    tasks = ListField(StringField())
    version = IntField()

    def add_task(self, task):
        qs = self.__class__.objects(id = self.id, version= self.version)
        nb_updated = qs.update_one(push__tasks = task, inc__version = 1)
        if nb_updated == 0:
            raise OptimisticLockException("Object was changed.")
        self.reload()  # <= CAN'T I AVOID THIS?

todo_list_1 = TodoList.objects.create(name = "Get rich",
                  tasks = ["Buy bitcoins", "Buy some more"])
todo_list_2 = TodoList.objects.get(name = "Get rich") # get the same

todo_list_1.add_task("Sell everything")
try:
    todo_list_2.add_task("Watch it crash!")
except OptimisticLockException:
    print "It crashed..."

todo_list_1.reload()
print todo_list_1.tasks  # prints [u'Buy bitcoins',u'Buy some more',
                         # u'Sell everything']
4

0 に答える 0