Python 对app engine中数据存储的并发访问

Python 对app engine中数据存储的并发访问,python,google-app-engine,transactions,google-cloud-datastore,Python,Google App Engine,Transactions,Google Cloud Datastore,我想知道db.run\u in\u事务是否充当数据存储操作的锁 并在对同一实体进行并发访问时提供帮助 在下面的代码中,是否保证并发访问不会导致竞争,并且不会创建新实体而进行重写 db.run_in_事务是否正确/最好的方法 在下面的代码中,我试图用下面的代码创建新的唯一实体 def txn(charmer=None): new = None key = my_magic() + random_part() sk = Snake.get_by_name(key) i

我想知道db.run\u in\u事务是否充当数据存储操作的锁 并在对同一实体进行并发访问时提供帮助

在下面的代码中,是否保证并发访问不会导致竞争,并且不会创建新实体而进行重写

db.run_in_事务是否正确/最好的方法

在下面的代码中,我试图用下面的代码创建新的唯一实体

def txn(charmer=None):
    new = None
    key = my_magic() + random_part()
    sk = Snake.get_by_name(key)
    if not sk:
       new = Snake(key_name=key, charmer= charmer)
       new.put()
    return new
db.run_in_transaction(txn, charmer) 

这是一种安全的方法。如果生成两次相同的名称,则只会创建一个实体

听起来您已经看过文档了。还有一个更重要的问题

查看文档,特别是其上的等效代码,它准确地回答了您提出的问题:

get和随后可能的put 被包装在事务中以确保 原子性。这意味着 获取或插入将永远不会覆盖 现有实体,并将插入 新实体当且仅当没有实体时 具有给定的种类和名称


这是一种安全的方法。如果生成两次相同的名称,则只会创建一个实体

听起来您已经看过文档了。还有一个更重要的问题

查看文档,特别是其上的等效代码,它准确地回答了您提出的问题:

get和随后可能的put 被包装在事务中以确保 原子性。这意味着 获取或插入将永远不会覆盖 现有实体,并将插入 新实体当且仅当没有实体时 具有给定的种类和名称


你所做的是正确的,有点像罗伯特已经解释过的


我不知道这是否可以称为“锁”。。。其工作方式是——该操作将假设没有其他人在同一时间尝试执行相同的操作,如果有人在尝试,它将给您一个异常。你需要弄清楚在这种情况下你想做什么。可能会要求用户选择一个新名称?

您所做的是正确的,类似于Robert已经解释过的


我不知道这是否可以称为“锁”。。。其工作方式是——该操作将假设没有其他人在同一时间尝试执行相同的操作,如果有人在尝试,它将给您一个异常。你需要弄清楚在这种情况下你想做什么。可能要求用户选择一个新名称?

非常感谢Robert Kluin的帮助。。。我曾想过使用it Model.get_或_insert,但想知道如何确保返回的实体是新创建的还是现有的。我应该比较返回实体的属性和我想放的属性吗?你们可以使用你们的代码,或者你们可以比较属性。假设在不同时间创建的两个实体不具有相同的属性,或者您不在乎它们是否具有相同的属性。非常感谢Robert Kluin的帮助。。。我曾想过使用it Model.get_或_insert,但想知道如何确保返回的实体是新创建的还是现有的。我应该比较返回实体的属性和我想放的属性吗?你们可以使用你们的代码,或者你们可以比较属性。假设在不同时间创建的两个实体不具有相同的属性,或者您不在乎它们是否具有相同的属性。