2014-03-30 71 views
1

我有嵌套事務威爾父事務太失敗了,如果嵌套事務失敗

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被COMMITED,或回滾,如果嵌套事務insert_customer_function失敗的碼?

https://www.sqlite.org/lang_savepoint.html,看來

注意,內部交易可能提交(使用RELEASE 命令),但後來有其工作由ROLLBACK在外部 交易撤銷。電源故障或程序崩潰或操作系統崩潰將導致 回滾最外層事務,撤消在外層事務中發生的所有 更改,甚至包含 被認爲已由RELEASE命令「提交」的更改。內容不是 實際上在磁盤上提交,直到提交最外面的事務 。

似乎

  • 如果外不承諾,即使內承諾,兩個外&內將回滾。

但是,如果,

  • 如果外犯,但內不提交,都將外&內將回滾?

回答

1

如果調用的方法失敗,則可以拋出異常,以便調用的方法獲取錯誤並且「父」事務也將回滾。

通過拋出異常,您強制執行錯誤,然後將錯誤傳回給調用者,該調用者在try catch塊中處理它。

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

+0

Thx。在這種情況下,你的意思是「如果外部提交,但內部不提交,外部和內部都將回滾? - 否」? –

+0

我的意思是這樣的:如果inner不提交,outer將會收到inner引發的錯誤。因此,outer會捕獲異常並且不會提交。您需要將** catch **添加到外部,以捕獲在回滾情況下由內部拋出的異常。 –

+0

因此,如果我不會從insert_customer_function中拋出異常,那麼可能會因爲deleteCustomer將被提交而導致空表結束。 –