使用 SQLite 进行 Peewee 空中碰撞检测

Peewee mid-air collision detection with SQLite

我有几个模型想同时更新。首先,我用一个简单的方法从数据库中获取他们的数据:

s = Store.get(Store.id == store_id)
new_book = Book.get(Book.id == data[book_id'])
old_book = Book.get(Book.id == s.books.id)

实际架构与此处无关。然后我对这些模型进行了一些更新,最后我将它们全部保存为:

s.save()
new_book.save()
old_book.save()

处理这些操作的函数使用 @db.atomic() 装饰器,因此写入被打包到一个事务中。问题是,如果在我 get() 来自数据库的数据和我保存修改后的数据的点之间,另一个进程已经改变了数据库中这些模型的某些东西。有没有一种方法可以仅在基础数据库行未更改的情况下执行这些写入(.save() 操作)?我可以读取它们的 last_changed 值,但同样,有没有办法同时进行 更新?如果数据已更改,只需抛出异常?

原来在官方文档中有一个解决方案叫做 Optimistic Locking