【发布时间】:2026-02-18 11:00:01
【问题描述】:
我对 Django 很陌生,我不知道如何管理并发。
我正在构建一个应用程序来保留设备。 我有一个带有 ManytomanyField 设备的 Reservation 模型。 当我创建一个新的预订时,我必须确保所有设备都可用。 我的代码的第一个版本不关心并发:
def validate_reservation(keys, begin, end):
eqpts = Equipment.objects.filter(pk__in=keys)
if all(eqpt.is_available(begin, end) for eqpt in eqpts):
res = Reservation(eqpts, begin, end)
res.save()
return True
else:
return False
is_available 方法检查给定日期是否已经有任何预订:
def is_available(self, begin, end):
return not self.reservations.filter(begin__lte=end, end__gte=begin).exists()
问题是运行此代码的两个用户可能会创建冲突预订,如果第一个在第二个检查设备可用性后保存他的预订。
我相信我可以通过交易解决问题,所以我想出了这个:
def validate_reservation(keys, begin, end):
with transaction.atomic():
eqpts = Equipment.objects.select_for_update().filter(pk__in=keys)
if all(eqpt.is_available(begin, end) for eqpt in eqpts):
res = Reservation(eqpts, begin, end)
res.save()
return True
else:
return False
这是否具有预期的行为? 我如何知道交易是否失败并通知用户?
有其他更好的方法吗?
【问题讨论】:
标签: python django database concurrency atomic