GreenDao 多表事务操作
场景: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冲突, 但是数据库不会写入数据
*/
}
}
GreenDao 多表事务操作的更多相关文章
- Oracle 数据库基本操作——实用手册、表操作、事务操作、序列
目录: 0. 参考链接与参考手册1. oracle 实用(常用操作)指令2. 数据库基本操作语法 a) 表操作 1)创建表 2)更新表 3)删除表 4)查询 b) 事务操作 c) 序列操作 1)创建序 ...
- 遇过的坑(2)—MyISAM表类型不支持事务操作
最近需要通过JDBC对数据库做事务型操作,实践时发现,并没有达到想要的效果,表现在:1.每次执行executeUpdate()后,数据就马上能在DB中查到.但按理来说,我还没执行commit(),DB ...
- SQL Server 表的管理_关于事务操作的详解(案例代码)
SQL Server 表的管理_关于事务操作的详解(案例代码) 1.概念 事务(transaction): 是将多个修改语句组合在一起的方法,这个方法中的所有语句只有全部执行才能正确完成功能.即要么全 ...
- Java中的多表&事务&DCL&一个多表操作例子
准备sql: 创建部门表 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO d ...
- mysql事务的坑----MyISAM表类型不支持事务操作
最近需要通过JDBC对数据库做事务型操作,实践时发现,并没有达到想要的效果,表现在:1.每次执行executeUpdate()后,数据就马上能在DB中查到.但按理来说,我还没执行commit(),DB ...
- Yii2 事务操作
官网关于Yii2 事务的说明文档 http://www.yiiframework.com/doc-2.0/guide-db-active-record.html Working with Transa ...
- Winform开发框架里面使用事务操作的原理及介绍
在很多情况下,事务是个很有用的东西,可以把一系列的操作组合成一个原子粒度的操作,一旦组合中某个地方出错,可以整个干净的进行滚回,不会留下脏数据:除此之外,事务还能提高批量操作的效率,如在本地SQLit ...
- andorid SQLite数据库的增删改查 和事务操作
.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...
- 使用JDBC进行数据库的事务操作(2)
本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...
随机推荐
- EasyGBS国标流媒体服务器GB28181国标方案安装使用文档
EasyGBS - GB28181 国标方案安装使用文档 下载 安装包下载,正式使用需商业授权, 功能一致 在线演示 在线API 架构图 EasySIPCMS SIP 中心信令服务, 单节点, 自带一 ...
- EasyNVR摄像机无插件直播流媒体服务器前端构建之输入框样式的调整
EasyNVR授权方式分为软件的授权和硬件授权两种方式,软件授权需要在软件输入永久邀请码可以激化永久授权 起初我们的界面设计是为了满足功能的需求就是 ,用户可以输入激活码提交,完成永久授权. 在实际的 ...
- UESTC 491 Tricks in Bits
Tricks in Bits Time Limit: 1000MS Memory Limit: 65535KB 64bit IO Format: %lld & %llu Submit ...
- Django基础流程
软件环境: Pycharm 2018.1 Python 3.6 Django 2.0.3 1.新建项目 直接使用Pycharm的菜单来创建项目,命名为mysite. mysite mysite __i ...
- docker desktop
https://github.com/rogaha/docker-desktop http://blog.csdn.net/tinylab/article/details/45443563
- SQL 排序的N种方法
一.手工查询得出名次 select * ,select count(*)+1 from T2 where T2.[成绩] > T1.[成绩] as 名次 from T1 结果: 1 2 3 3 ...
- Python中的默认参数(转)
add by zhj: Python设计者为何将默认参数设计成这样呢?参见Python函数参数默认值的陷阱和原理深究 原文:https://github.com/acmerfight/insight_ ...
- HDU 4193 Non-negative Partial Sums(单调队列)
题目大意: 给定一个长度为n的循环序列.从n个不同位置開始,问有几个位置使得一下情况成立:全部前缀的和都大等于0(n <=1000000). 下午的训练赛.之前没学过单调队列所以用的线段树 ...
- swift笔记——环境搭建及Hello,Swift!
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/enson16855/article/details/29829601 首先要下载XCode6,仅仅有 ...
- shuit模块
shuit模块 #高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中,可以部分内容 def copyf ...