在NDB和GAE中的put()之前评估条件

时间:2018-11-17 11:07:11

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

我在基于GAE的应用程序中有一个模型,该模型经常更新。在某些情况下,碰巧几乎是同时更新同一实体。应用程序中的实体更新功能如下:

  1. 用户输入要更新的实体的ID和其他属性。
  2. 根据此ID从数据库中检索实体(以确保ID有效)。
  3. 对将要更新的属性进行一堆验证(例如,如果要更新group_id属性,请确保该ID中的组存在于数据库中,并且ID为整数。)
  4. 验证后,在步骤2中检索到的实体上调用put()。

因为,我提到同一个实体几乎可以同时更新多次,所以我遇到了经典的种族条件问题。也就是说,假设先后进行了2次更新调用,在第一个调用实体中已检索到并进行了验证,但与此同时,第二个调用触发了它检索相同的内容并更新了其属性。第二个调用还执行put()和更新数据库中的实体。注意,第一次调用尚未完成(由于一些时间延迟),它现在完成并调用put()并更新DB中的实体。

DB的最终结果将不在第一次更新调用中,但是预期结果是第二次调用!

我在GAE上对此进行了研究,并发现了预先放置的钩子。我认为我可以使用“更新的”时间戳来解决此问题,即确保第二次调用仅在第一次调用后才更新实体。但是,我想在这里使用一些更好的方法,例如一些数据库(如AWS中的数据库)在每个数据库行中都提供标签,我们可以要求数据库本身在实际放置记录之前验证此标签。我很好奇,因为GAE可以采取任何措施。即要求DB执行条件put()而不是手动使用pre_put挂钩?

0 个答案:

没有答案