gpt4 book ai didi

python - 如何限制行并防止预订系统的竞争条件

转载 作者:行者123 更新时间:2023-11-29 12:12:06 26 4
gpt4 key购买 nike

我正在构建一个产品预订系统。假设我有一个包含名称和数量字段的产品表(“my-tshirt”,2)。我还有一个预订表,它将产品 ID 映射到用户 ID。如何确保该表只有两个预订条目?我怎样才能防止任何竞争条件?我需要为此担心吗?我读过航空公司和酒店的人说分配 15 分钟的 session ,但我更愿意实时进行,一旦您点击预订按钮,我们可以立即(即 0.1-5.0 秒)告诉您您是否有没有预定。

我正在使用 Tornado、SQLAlchemy、Postgres,并且还在使用 Redis 来做各种事情。

最佳答案

要回答您的问题,是的,您确实需要担心竞争条件。我建议处理问题的方法是使用 FOR UPDATE select 语句。这将允许您找到您要查找的行,锁定它并更新它,而无需在您修改它的时候另一个线程进入并查询或修改它。像这样的东西应该可以解决问题:

try:
productToUpdate = session.query(Product).filter(Product.name == "my-tshirt", Product.quantity > 0).with_for_update().one() #assume Product.name is unique and name exists
except sqlalchemy.orm.exc.NoResultFound as e:
return "No reservations available" #Handle no reservation case here
productToUpdate.quantity -= 1
newReservation = Reservation()
newReservation.product = productToUpdate #assume relationship setup
newReservation.user = userForReservation #assume relationship setup
session.commit()

编辑:

如果您不想更新产品数量并保留单独的预订数量,有两种处理方式。

正如您在问题中所问,首先是从预订表中获取预订总和,并将其与可用产品数量进行比较。我建议不要这样做,因为为了避免竞争条件,您需要锁定保留表以防止插入行,这会影响其他线程,并可能根据您的表使用情况大幅减慢速度。在不锁定表的情况下,另一个线程可以在您查询总数之后,在您创建另一个条目之前插入一个预订。

第二种方法,也是我的建议,是在 Product 表中添加一列用于预订计数,并在更新预订表的同时更新该列。这仍然有可能在读取后将预订插入到表中,但如果您的应用程序在未锁定 Product 表的情况下不插入到预订表中,您可以确保您的数据准确无误。

try:
productToUpdate = session.query(Product).filter(Product.name == "my-tshirt", Product.quantity - Product.reservations >= quantityToReserve).with_for_update().one() #assume Product.name is unique and name exists
except sqlalchemy.orm.exc.NoResultFound as e:
return "No reservations available" #Handle no reservation case here
productToUpdate.reservations += quantityToReserve
#can put in another query and logic here to see if you're updating a reservation, or creating a new one
newReservation = Reservation(reservationQuantity = quantityToReserve)
newReservation.product = productToUpdate #assume relationship setup
newReservation.user = userForReservation #assume relationship setup
session.commit()

有关 postgres 的 FOR UPDATE 的一些阅读是 here

关于 with_for_update() 的一些阅读是 here

关于python - 如何限制行并防止预订系统的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28485370/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com