场景:Android APP多表操作事务管理

使用Android自带的sql操作类操作的时候需要手动处理事务,使用GreenDao的时候不用管了,啥都处理好了。但是,如果是多表操作的话,怎么统一管理事务?

关键思想是事务嵌套,具体方法使用:

DaoSession().callInTx()

  

看源码可以知道callInTx里面有一层事务管理,实际调用insert、update之类的具体方法的时候,里面还有一层事务。进行事务嵌套后,只要内层的事务有一个操作失败,最外层的事务就认为整个事务都失败,其他操作就回滚了。

以下是示例代码:

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(, ); // true
Log.e(TAG, "a: " + a);
/*
执行上面代码: 数据库写入两条数据
*/ boolean b = b(, );// false, 打印异常日志
Log.e(TAG, "b: " + b);
/*
执行上面代码: Table插入数据, TableArea id冲突, 写入失败
*/ boolean c = a(, );// false
Log.e(TAG, "c: " + c);
/*
执行上面代码: Table id不会冲突, TableArea id冲突, 但是数据库不会写入数据
*/
}
}

最新文章

  1. POJ 1279 Art Gallery(半平面交)
  2. valgind使用错误——检测不同位目标程序
  3. iOS之 随笔-静态库创建Xcode7
  4. c语言字符串操作,及常用函数
  5. avalon 中require.config源码分析
  6. poj 2031Building a Space Station
  7. android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法
  8. [Hapi.js] Managing State with Cookies
  9. myEclipse 8.5下SVN环境的搭建
  10. 【JAVA】配置JAVA环境变量
  11. [iOS] file patterns: The `public_header_files` pattern did not match any file.
  12. js 滚动到一定位置导航定位在页面最顶部
  13. BZOJ2809 [Apio2012]dispatching 可并堆
  14. python全栈开发目录
  15. 07_Linux 终端命令格式
  16. MySQL 安装方法
  17. poj 1509
  18. Linux内核分析第三周——构造一个简单的Linux系统MenuOS
  19. bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵
  20. mysql 创建函数ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_f

热门文章

  1. SharePoint服务器端对象模型 之 访问文件和文件夹(Part 1)
  2. SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 4)
  3. selenium 用autoIT上传下载文件
  4. python3爬虫-分析Ajax,抓取今日头条街拍美图
  5. windows中使用Findwindow函数与FindWindowEx函数来实现自动控制、触发第三方软件事件的方法
  6. Summaries On Java
  7. CodeForces - 691E Xor-sequences 【矩阵快速幂】
  8. Confluent介绍
  9. java 图片Base64字符串转图片二进制数组
  10. 快乐学习 Ionic Framework+PhoneGap 手册1-4 {登录页面}