場景:Android APP多表操做事務管理java
使用Android自帶的sql操做類操做的時候須要手動處理事務,使用GreenDao的時候不用管了,啥都處理好了。可是,若是是多表操做的話,怎麼統一管理事務?sql
關鍵思想是事務嵌套,具體方法使用:數據庫
DaoSession().callInTx()
看源碼能夠知道callInTx裏面有一層事務管理,實際調用insert、update之類的具體方法的時候,裏面還有一層事務。進行事務嵌套後,只要內層的事務有一個操做失敗,最外層的事務就認爲整個事務都失敗,其餘操做就回滾了。ide
如下是示例代碼:測試
public class TransactionTest { static String TAG = TransactionTest.class.getName(); // DaoManager是我自定義的類 public static boolean a(final long id1, final long id2) { try { // 還有一個runInTx的方法, 跟callInTx的區別是沒返回值. 根據實際狀況自由選擇就行. return DaoManager.getDaoSession().callInTx(new Callable<Boolean>() { @Override public Boolean call() { TableDao tableDao = DaoManager.getDaoSession().getTableDao(); TableAreaDao tableAreaDao = DaoManager.getDaoSession().getTableAreaDao(); Table table = new Table(); table.setId(id1); // id主鍵, 第二次調用確定主鍵衝突, 致使異常 table.setTable_name("測試桌臺 @atearsan"); tableDao.insert(table); TableArea area = new TableArea(); area.setId(id2); area.setArea_name("測試區域 @atearsan"); tableAreaDao.insert(area); return true; } }); } catch (Exception e) { Log.e(TAG, e.getMessage()); return false; } } public static boolean b(final long id1, final long id2) { try { TableDao tableDao = DaoManager.getDaoSession().getTableDao(); TableAreaDao tableAreaDao = DaoManager.getDaoSession().getTableAreaDao(); Table table = new Table(); table.setId(id1); table.setTable_name("測試桌臺 @atearsan"); tableDao.insert(table); TableArea area = new TableArea(); area.setId(id2); area.setArea_name("測試區域 @atearsan"); tableAreaDao.insert(area); return true; } catch (Exception e) { Log.e(TAG, e.getMessage()); return false; } } public static void test() { boolean a = a(1, 2); // true Log.e(TAG, "a: " + a); /* 執行上面代碼: 數據庫寫入兩條數據 */ boolean b = b(2, 2);// false, 打印異常日誌 Log.e(TAG, "b: " + b); /* 執行上面代碼: Table插入數據, TableArea id衝突, 寫入失敗 */ boolean c = a(3, 2);// false Log.e(TAG, "c: " + c); /* 執行上面代碼: Table id不會衝突, TableArea id衝突, 可是數據庫不會寫入數據 */ } }