【问题标题】:Google App Engine: (Python 2.7) Do Transactions work when using the Memcache as well as the DatastoreGoogle App Engine:(Python 2.7)使用 Memcache 和 Datastore 时事务是否有效
【发布时间】:2013-03-08 05:36:37
【问题描述】:

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

Google App Engine: (Python) Datastore transactions and idempotence

今天我意识到事务是数据存储的一项功能,但大多数时候我都是从 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

这行得通吗?

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

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

【问题讨论】:

标签: google-app-engine transactions memcached


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2011-07-09
    • 1970-01-01
    • 2012-08-05
    • 2012-09-26
    • 2012-03-10
    相关资源
    最近更新 更多