我想要创建并存储在数据存储中的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/