我正在使用GAE Python开发一个售票网站。该网站列出了所选日期的可用车辆,并允许客户进行预订 当客户选择车辆并进行预订时,我想暂时阻止当天的车辆,以便其他人无法使用我们的网站进行预订。如果客户未能正确付款,则此临时块应在接下来的两分钟内自动撤销 我打算有一个如下的模型:
class Availability(ndb.Model):
vehicle = ndb.StringProperty()
date = ndb.DateTimeProperty()
status = ndb.StringProperty() #"available" or "booked"
temporary_blocking_time = ndb.DateTimeProperty()
我会更新所选车辆和日期的“temporary_blocking_time”变量。当任何其他客户在同一天搜索车辆时,将检查该车辆的“temporary_blocking_time”,如果该车辆不到两分钟,则不会列出该车辆以供客户预订。
t0< t1< t2< T3
这个逻辑的问题是:当客户“X”想要继续预订给定车辆时,我读取该车辆的“temporary_blocking_time”(在时间“t1”)并将当前时间写入该时间(在时间“t2”) )。
当另一个客户也选择了相同的车辆相同的日期,并且在时间“t0”读取了“temporary_blocking_time”并在“t3”将其写回时,可能会出现问题。这将覆盖客户“X”的预订。
要添加此问题,可能还会出现一致性问题。
如何改进逻辑设计来解决这个问题
答案 0 :(得分:1)
考虑使用get
查看temporary_blocking_time
是否有效,put
将其设置为transaction。这会使t3的put
失败,因为t2的put
发生在t0之后。
答案 1 :(得分:0)