使用Google App Engine交易

时间:2016-02-04 13:16:31

标签: google-app-engine transactions google-cloud-datastore app-engine-ndb

我有两个任务(ab)应该在事务中执行这些任务以避免不一致。我可能需要同时执行其中一项任务或两项任务。

在下面的代码中function_a执行task afunction_b执行task b

@ndb.transactional
def function_a():
    # basic validations
    # read entity of type A
    # make changes to entity
    # write entity
    return

@ndb.transactional
def function_b():
    # basic validations
    # read entity of type B
    # make changes to entity
    # write entity
    return

所以,如果我需要一起执行任务a和b。我可以执行以下操作: -

def function_ab():
    function_a()
    function_b()
    return

但是此实现不会保持AB的一致性,因此我也需要将其设置为事务性。

@ndb.transactional
def function_ab():
    function_a()
    function_b()
    return

因此,在这样的实现中,为了代码可重用性,多次使用事务(一次在function_ab上,一次用于个人funcion_afunction_b)。如果我不寻求代码可重用性,我可以执行以下操作: -

@ndb.transactional
def function_ab():
    # basic validations
    # read entity of type A
    # make changes to entity
    # write entity

    # basic validations
    # read entity of type B
    # make changes to entity
    # write entity    
    return

我不太了解交易如何在应用程序引擎中运行,所以我的问题是,使用具有代码可重用性的事务是否有任何缺点(性能等),而不是代码可重用性和代码可重用性方法真的有用吗?

1 个答案:

答案 0 :(得分:1)

您无法嵌套交易,您的交易function_ab()会出错。

但是你仍然可以通过确保只有顶级函数是事务性的来安排重用代码,而内部函数只是检查它们确实在事务中。也许是这些方面的东西:

def function_a():
    assert ndb.in_transaction()
    return

def function_b():
    assert ndb.in_transaction()
    return

@ndb.transactional
def function_ab(do_a, do_b):
    if do_a:
        function_a()
    if do_b:
        function_b()

您的使用模式实际上是适合使用ndb异步tasklet的教科书,效率更高。在Tasklets, Parallel Queries, Parallel Yield中查找get_cart_plus_offers()示例。