在GAE Python Web中回滚数据存储区PUT事务

时间:2016-09-22 07:48:14

标签: python google-app-engine google-cloud-datastore rollback

该方法中有一个方法我将三个不同的模型记录插入数据库。但是如果发生某些异常或错误,我需要从db回滚此插入事务。 以下是方法的展示案例。

def post():
    try:
        model1 = Model1()
        model1.key1 = 'key1'
        model1.key2 = 'key2'
        model1.put()

        #some logic1 code block goes here
        .
        .
        model2 = Model2()
        model2.key2 = 'key2'
        model2.key2 = 'key2'
        model2.put()

        #some logic2 code block goes here
        .
        .
        model3 = Model3()
        model3.key3 = 'key3'
        model3.key3 = 'key3'
        model3.put()

        #some logic3 block goes here
        .
        .
    except Exception:
        #all the database insertion transaction which happened should be rollback here.

这里Model1,Model2和Model3是google.appengine.ext.ndb.Model扩展模型类。 现在假设logic1 code block中发生了异常,那么model1应该回滚,因为它是在执行此logic1 code block之前插入的。同样,如果logic2 code block中发生异常,那么model1 & model2以上的两个都应该回滚,依此类推。我的问题非常普遍。我做了很多搜索,但无法找到任何解决方案。我完全是Python和GAE的新手。请帮忙。

1 个答案:

答案 0 :(得分:-1)

正如@Daniel Roseman链接的那样,答案在NDB Transaction page上。只需搜索“回滚”一词,你就会看到它。

对于您的代码,这意味着:

xg-True

请注意,在装饰器上我已指定myArray[index++] = atoi( line.c_str() ); ,因为从您的代码段开始,它看起来很可能是跨实体组事务。如果不是这种情况并且所有实体都具有相同的根祖先,则可以省略它。

另请注意,ndb.Rollback纯粹是一个方便的例外 - 在事务修饰函数中引发的任何异常都会导致回滚。