0

前几天我发了一个关于事务和幂等性的问题,但没有得到太多回应。

Google App Engine:(Python)数据存储事务和幂等性

今天我意识到事务是数据存储的一个特性,但大多数时候我都是从 Memcache 中提取数据,做一堆工作,然后保存回 memcache数据存储。

如果内存缓存中缺少数据,我只会从数据存储中获取数据。

在事务中放置一个函数会阻止另一个请求从内存缓存中提取相同的数据吗?

这些示例通常如下所示。

Begin Transaction
    Get Data from Datastore
    Do Work on data
    Put data back in Datastore

根据我的代码,很多时候看起来像这样

 Begin Transaction
    Get data from Memcache
    if not data:
        Get data from Datastore
    Do work on data
    Put to Memcache
    Put to Datastore

这行得通吗?

事务代码是否足够聪明,可以知道防止整个块同时运行,还是仅在事务函数中从第一个数据存储操作到最后一个数据存储操作的锁定?

是否有可能两个请求从内存缓存中提取相同的数据,完成工作,但在将数据放回数据存储区时不会发生冲突,导致后一个请求踩到第一个请求的更改?

4

1 回答 1

3

不,数据库事务不跨越内存缓存。

另外 - 事务不锁定。他们使用乐观并发控制,在后台每个数据库实体都有一个更新时间,在事务提交时会检查它。如果事务中使用的实体(= 实体组)的更新时间已更改,则事务是脏的并引发异常 - 您需要重复整个事务(这是低级的,我相信 python NDM 会为您完成部分工作) .

因此,要进行事务,您需要在开始时从数据存储中加载数据,以获得事务工作所需的“更新时间”。您的代码可以工作,但不会是事务性的。

于 2013-03-08T07:01:28.060 回答