锁定实体以在Google Cloud数据存储区中执行获取更新集操作

use*_*455 5 python multithreading google-cloud-datastore google-cloud-platform

推荐一种锁定实体(例如User(amount_earned))以在Google Cloud Datastore上执行一致的读取->更新->设置操作的方法。

使用memcache,我们通常执行memcache.add(lock_key),以确保只有进程/线程在修改对象。

由于内存缓存的添加是原子的,并且返回false,因此如果先前未添加密钥,则使用内存缓存可以轻松模拟“锁定”。

如何在Google Cloud数据存储区上模拟类似的锁定语义。

理想地

with gcp.lock(lock_key)as key:
   user.get(user_id) # read
   user.update(amount) # update
   user.set() # save

# Release the lock, so that other processes can now updated user (identified by user_id) object
Run Code Online (Sandbox Code Playgroud)

小智 5

您也许可以使用事务乐观锁定策略。

让我们以更新用户实体为例。为了使用乐观锁定,您必须使用特殊属性(例如,实体版本)。对于每次更新,版本字段将增加一。更新实体的步骤:

  1. 加载实体
  2. 假设您有一个允许更新用户实体的UI。在编辑模式下在屏幕上显示实体。
  3. 最终用户查看/更改实体
  4. 最终用户单击“保存”
  5. 现在开始交易
  6. 使用实体的密钥加载用户实体
  7. 比较新加载的实体和先前加载到UI的实体的版本
  8. 如果版本匹配,则没有其他人更新该实体,因此继续更新该实体并提交事务。确保在更新/提交时增加版本号。如果版本不匹配,则其他人更改了实体。不更新实体,回滚事务。采取适当的措施。例如,您可以向用户显示一条消息,并让他查看最新的实体并进行任何进一步的更改。