google-app-engine - Google App Engine - 处理存储对象的并发问题

标签 google-app-engine concurrency google-cloud-datastore

我想要创建并存储在数据存储中的User对象有一个电子邮件和一个用户名。如何确保在创建我的 User 对象时,另一个 User 对象不会也具有相同的 email 或相同的 用户名

如果我只是进行查询以查看是否有任何其他用户已经使用过该用户名或电子邮件,则可能会出现竞争条件。

更新: 我目前正在考虑的解决方案是使用MemCache来实现锁定机制。在尝试将 User 对象存储在数据存储中之前,我会获取 2 个锁。首先是一个基于电子邮件锁定的锁,然后是另一个基于用户名锁定的锁。

由于创建新的 User 对象仅在用户注册时发生,而且两个人尝试使用相同的用户名或相同的电子邮件的情况更加罕见,因此我认为性能受到影响是可以接受的的锁定。

我正在考虑使用此处的 MemCache 锁定代码:http://appengine-cookbook.appspot.com/recipe/mutex-using-memcache-api/

大家觉得怎么样?

最佳答案

尝试使用电子邮件作为key_name来存储您的用户。只需一个简单的步骤即可完成此操作:

MyUser.get_or_insert(email)

通过电子邮件获取您的MyUser也很容易:

MyUser.get_by_key_name(email)

查看类似的问题:add properties to users google app engine

这样就解决了两个用户使用同一电子邮件的问题。要对用户名执行相同的操作,请在 transaction 中执行“获取具有此用户名的用户”查询和“插入具有此用户名的用户”。 (这就是 get_or_insert() 在幕后所做的事情)。

您可以捕获 TransactionFailedError 来查找其他用户在您的交易期间“获取”该用户名的情况。

肯定不想使用 memcache 互斥体,因为等待锁释放的 while 循环可能会花费大量的 memcache API 调用配额.

关于google-app-engine - Google App Engine - 处理存储对象的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2603418/

相关文章:

java - AOP+同步

python - 如何在GAE上处理大文件?

java - 无法为处理程序 "org.jboss.as.capedwarf.api.Logger"加载类 "CAPEDWARF"

google-app-engine - 从 Google Dataflow 保存到 Google Datastore

java - 如何将 google 身份验证 token (在 iOS 中获得)传递到 google-app-engine Web servlet?

java - objectify 中的附近搜索

google-app-engine - 数据存储区 : invalid entity type on get

python - 没有名为 _mysql 的模块 - Google App Engine 和 Django

python-3.x - 如何将对象与可迭代对象一起传递给 executor.map?

java - 暂停方法的执行,直到回调完成