【发布时间】:2014-10-18 23:03:14
【问题描述】:
我有一个简单的数据库关系:一个 Item 与多个 ItemDetails 相关。 ItemDetails 会立即更新:一条消息通过 HTTP POST 传入,其中包含完整的 ItemDetails 集,以替换任何旧的 ItemDetails。我使用的逻辑是这样的:
with transaction.atomic():
...
ItemDetails.objects.filter(item_id=item_id).all().delete()
for item in new_item_list:
ItemDetails.objects.create(title=item.title, ...)
但是如果两个发件人同时发送更新,这似乎有一个竞争条件。我有时会看到重复的列表,因为(我认为)delete() 在或多或少并行的两个线程上运行,然后创建发生。
我可以使用什么锁定策略来避免这个问题?我正在使用 Django 和 PostgreSQL。
【问题讨论】:
-
你知道
SELECT FOR UPDATE吗?您应该锁定父项,进行更新并提交事务。 -
我没有,但我现在做了,看起来很完美。把它写成答案,测试后我会接受。
-
我并不急需积分。如果您有时间随意编写并接受它 - 无论如何它会更好地解释动机+解决方案。
标签: django postgresql django-orm database-locking