在android中sql事务失败后到底发生了什么?

时间:2012-08-10 20:43:38

标签: android

如果您正在使用事务并且sql操作失败,我知道它会回滚所有更改,但是它会在finally语句之后暂停所有代码还是其余的继续运行?

下面的代码看起来是正确的还是我应该使用catch语句?是否可以为测试目的模拟错误?

public static boolean updateSuccessful = false;

updateToVersion2();
//Does anything after here still run on error?

if(!updateSuccessful) {
    deleteAndRecreateDatabase();
}


public void updateToDbVersion2() {
    this.myDataBase.beginTransaction();
    try {
        this.myDataBase.execSQL("UPDATE myRecords SET column = 'newValue1' WHERE _id = 1");
        this.myDataBase.execSQL("UPDATE myRecords SET column = 'newValue2' WHERE _id = 2");
        this.myDataBase.setTransactionSuccessful();
        // This is not reached on update error, right?
        updateSuccessful = true;
    } finally {
        this.myDataBase.endTransaction();
    }
}

3 个答案:

答案 0 :(得分:1)

你应该抓住异常!为什么你把它留下来让代码闻起来很糟糕......

如果execSQLsetTransactionSuccessful之间确实发生了异常并最终落入您结束交易的finally部分,该怎么办?

代码可能是这样的:

public void updateToDbVersion2() {
    boolean fubar = false;
    this.myDataBase.beginTransaction();
    try {
        this.myDataBase.execSQL("UPDATE myRecords SET column = 'newValue1' WHERE _id = 1");
        this.myDataBase.execSQL("UPDATE myRecords SET column = 'newValue2' WHERE _id = 2");
        this.myDataBase.setTransactionSuccessful();
        // This is not reached on update error, right?
        updateSuccessful = true;
    } catch(Exception ex){
        fubar = true;
        // Do whatever is needed to be done such as logcat FOR debugging ONLY!
    } finally {
        if (!fubar){
            // No exceptions occurred, OK to end transaction
            this.myDataBase.endTransaction();
        }
    }
}

请注意finally子句的条件检查如何确保防止潜在的混乱并确保数据完整性。

答案 1 :(得分:0)

答案 2 :(得分:0)

交易本身就是一个整体。无论是成功还是失败,这意味着您要么在DB中获取所有数据,要么什么都得不到(当然在此事务中)。 如果交易在某些时候失败,它应该首先进入" catch"部分和#34;最后"后。

正如user827992指出的那样,抓住异常会很有趣。那里可能会有一些额外的(可能有价值的)信息。