我有两个任务(a
,b
)应该在事务中执行这些任务以避免不一致。我可能需要同时执行其中一项任务或两项任务。
在下面的代码中function_a
执行task a
,function_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
但是此实现不会保持A
和B
的一致性,因此我也需要将其设置为事务性。
@ndb.transactional
def function_ab():
function_a()
function_b()
return
因此,在这样的实现中,为了代码可重用性,多次使用事务(一次在function_ab
上,一次用于个人funcion_a
和function_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
我不太了解交易如何在应用程序引擎中运行,所以我的问题是,使用具有代码可重用性的事务是否有任何缺点(性能等),而不是代码可重用性和代码可重用性方法真的有用吗?
答案 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()
示例。