如果嵌套事务失败,父事务也会失败

时间:2014-03-30 17:24:45

标签: android sqlite

我有嵌套事务的代码

db.beginTransaction();
try {
    deleteCustomer();
    insert_customer_function();

    // No exception throw. Success
    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
}

void insert_customer_function() {
    db.beginTransaction();
    try {
        insertCustomer();
        // Exception throw somehow...
        db.setTransactionSuccessful();
    } catch (Exception ex) {
    } finally {
        db.endTransaction();
    }
}

我想知道,如果嵌套事务deleteCustomer失败,是会提交insert_customer_function还是回滚?

来自https://www.sqlite.org/lang_savepoint.html,似乎

  

请注意,内部事务可能会提交(使用RELEASE   命令)但后来在外部通过ROLLBACK撤消了它的工作   交易。电源故障或程序崩溃或操作系统崩溃将导致   要回滚的最外层事务,撤消所有已更改的事务   发生在那个外部交易中,甚至发生了变化   据说已被承诺"通过RELEASE命令。内容不是   实际上在磁盘上提交,直到最外面的事务   提交。

似乎

  • 如果外部没有提交,甚至内部都会被提交,无论是外部还是外部。内心将被回滚。

但是,如果,

  • 如果外部提交,但内部不提交,则外部和外部提交内心会被回滚吗?

1 个答案:

答案 0 :(得分:1)

如果被调用的方法失败,您可以抛出异常,因此调用的方法会出现错误并且" parent"交易也会回滚。

通过抛出异常,你强制一个错误,然后将错误传回给调用者,调用者在try catch块中处理它。

快速参考:http://androidcookbook.com/Recipe.seam;jsessionid=0443546CEE776318BF6D21552A9D1864?recipeId=75&recipeFrom=ViewTOC