我在基于GAE的应用程序中有一个模型,该模型经常更新。在某些情况下,碰巧几乎是同时更新同一实体。应用程序中的实体更新功能如下:
因为,我提到同一个实体几乎可以同时更新多次,所以我遇到了经典的种族条件问题。也就是说,假设先后进行了2次更新调用,在第一个调用实体中已检索到并进行了验证,但与此同时,第二个调用触发了它检索相同的内容并更新了其属性。第二个调用还执行put()和更新数据库中的实体。注意,第一次调用尚未完成(由于一些时间延迟),它现在完成并调用put()并更新DB中的实体。
DB的最终结果将不在第一次更新调用中,但是预期结果是第二次调用!
我在GAE上对此进行了研究,并发现了预先放置的钩子。我认为我可以使用“更新的”时间戳来解决此问题,即确保第二次调用仅在第一次调用后才更新实体。但是,我想在这里使用一些更好的方法,例如一些数据库(如AWS中的数据库)在每个数据库行中都提供标签,我们可以要求数据库本身在实际放置记录之前验证此标签。我很好奇,因为GAE可以采取任何措施。即要求DB执行条件put()而不是手动使用pre_put挂钩?