如果您正在使用事务并且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();
}
}
答案 0 :(得分:1)
你应该抓住异常!为什么你把它留下来让代码闻起来很糟糕......
如果execSQL
和setTransactionSuccessful
之间确实发生了异常并最终落入您结束交易的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指出的那样,抓住异常会很有趣。那里可能会有一些额外的(可能有价值的)信息。