GAE Python NDB中并发读写场景所需的建议

时间:2014-01-31 16:27:48

标签: python google-app-engine google-cloud-datastore app-engine-ndb

我正在使用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”的预订。

要添加此问题,可能还会出现一致性问题。

如何改进逻辑设计来解决这个问题

2 个答案:

答案 0 :(得分:1)

考虑使用get查看temporary_blocking_time是否有效,put将其设置为transaction。这会使t3的put失败,因为t2的put发生在t0之后。

答案 1 :(得分:0)