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 ...
随机推荐
- sparse matrix
w https://en.wikipedia.org/wiki/Sparse_matrix 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB - Bin的专栏 - 博客园ht ...
- mysql练手
1.根据图创建下列表格 没有外键的表先创建,创建顺序为teacher,class,course,student CREATE TABLE class ( cid INT NOT NULL auto_i ...
- 洛谷 P2721 小Q的赚钱计划
洛谷 这大概是我见过最水的紫题吧- 洛谷标签赞一个! 题意:你有一年时间,把10w元存银行变成更多钱,在特定时间区间内,你会有一些利息,不过不可中途退出. 直接dp:st[i]表示区间左端点,ed[i ...
- python下多线程的限制以及多进程中传递参数的方式
python多线程有个全局解释器锁(global interpreter lock),这个锁的意思是任一时间只能有一个线程使用解释器,跟单cpu跑多个程序一个意思,大家都是轮着用的,这叫“并发”,不是 ...
- 024-Spring Boot 应用的打包和部署
一.概述 二.手工打包[不推荐] 打包命令:maven clean package 打包并导出依赖:maven clean package dependency:copy-dependencies 1 ...
- mybatis-generator和TKmybatis的结合使用
mybatis-generator可以自动生成mapper和entity文件,mybatis-generator有三种用法:命令行.eclipse插件.maven插件.这里使用的是maven插件方式, ...
- Python2 socket 多线程并发 ThreadingTCPServer Demo
# -*- coding:utf-8 -*- from SocketServer import TCPServer, StreamRequestHandler import traceback cla ...
- 解释一下python中的继承
当一个类继承另一个类,它就被称为一个子类/派生类,继承父类/基类/超类.它会继承/获取所有类成员(属性和方法) 继承能让我们重新使用代码,也能更容易的创建和维护应用 单继承:一个类继承单个基类 多继承 ...
- Mapinfo修改道路方向
在mapinfp工具管理添加插件Reverse Line Direction,就可以修改道路方向 插件
- c# 执行批处理文件
ProcessStartInfo proc = new ProcessStartInfo(); proc.UseShellExecute = false; proc.CreateNoWindow = ...