gpt4 book ai didi

google-app-engine - 如何使用 ndb 使 blobstore 删除操作事务安全?

转载 作者:太空宇宙 更新时间:2023-11-03 15:36:48 26 4
gpt4 key购买 nike

如果我们启动一个事务来删除 appengine 上的一个复杂对象,并且该对象附加了一些需要删除的 blob 引用,我们就会遇到问题。如果我们只是删除 blob,事务可能会失败,但是 blob 已经消失了,因为 blobstore 是独立工作的(这违背了事务的理念)。

现在我们有了这个很酷的新 NDB,它有一个上下文缓存,没有记录的 API(?)可以解决这个问题。

工具箱:

  • ndb.get_context()(在 ndb 的函数引用中未记录)
  • ndb_context.call_on_commit(delete_blobs_call_on_commit)

    def delete_blobs_call_on_commit():
    ndb_context = ndb.get_context()
    blobstore.delete(ndb_context.list_of_blobkeys_to_delete)
    # OR: taskqueue.add(url+ndb_context.list_of_blobkeys_to_delete)

任务:将交易期间要删除的 blobkeys 附加到上下文对象,并在交易后删除它们。

更新:call_on_commit() 不允许数据库操作(可能包括 blobstore.delete,但还没有尝试过)并且会抛出 BadRequestError:无法在已完成的事务中启动新操作,因此唯一的解决方案可能真的是任务队列。

更新:可以从使用 call_on_commit() 注册的函数调用带有 @ndb.non_transactional 装饰器的函数。因此,可以尝试在提交成功时删除 blob,并希望您没有会导致孤儿的异常。

问题:如何安全地使用上下文缓存?你是如何解决 blob 删除问题的?

最佳答案

AFAIK blob 实际上在数据存储中有一个表示,因此您可以在交易中使用它们。

要安全地使用上下文缓存,请使用带有这些标志的常规模型/ key get() 和 put() 操作:use_memcache=False、use_datastore=False、use_cache=True。您还可以将这些标志作为类变量放在模型定义中。

关于google-app-engine - 如何使用 ndb 使 blobstore 删除操作事务安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17671507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com