场景: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 多表事务操作的更多相关文章

  1. Oracle 数据库基本操作——实用手册、表操作、事务操作、序列

    目录: 0. 参考链接与参考手册1. oracle 实用(常用操作)指令2. 数据库基本操作语法 a) 表操作 1)创建表 2)更新表 3)删除表 4)查询 b) 事务操作 c) 序列操作 1)创建序 ...

  2. 遇过的坑(2)—MyISAM表类型不支持事务操作

    最近需要通过JDBC对数据库做事务型操作,实践时发现,并没有达到想要的效果,表现在:1.每次执行executeUpdate()后,数据就马上能在DB中查到.但按理来说,我还没执行commit(),DB ...

  3. SQL Server 表的管理_关于事务操作的详解(案例代码)

    SQL Server 表的管理_关于事务操作的详解(案例代码) 1.概念 事务(transaction): 是将多个修改语句组合在一起的方法,这个方法中的所有语句只有全部执行才能正确完成功能.即要么全 ...

  4. Java中的多表&事务&DCL&一个多表操作例子

    准备sql: 创建部门表 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO d ...

  5. mysql事务的坑----MyISAM表类型不支持事务操作

    最近需要通过JDBC对数据库做事务型操作,实践时发现,并没有达到想要的效果,表现在:1.每次执行executeUpdate()后,数据就马上能在DB中查到.但按理来说,我还没执行commit(),DB ...

  6. Yii2 事务操作

    官网关于Yii2 事务的说明文档 http://www.yiiframework.com/doc-2.0/guide-db-active-record.html Working with Transa ...

  7. Winform开发框架里面使用事务操作的原理及介绍

    在很多情况下,事务是个很有用的东西,可以把一系列的操作组合成一个原子粒度的操作,一旦组合中某个地方出错,可以整个干净的进行滚回,不会留下脏数据:除此之外,事务还能提高批量操作的效率,如在本地SQLit ...

  8. andorid SQLite数据库的增删改查 和事务操作

    .xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...

  9. 使用JDBC进行数据库的事务操作(2)

    本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...

随机推荐

  1. #1589 : 回文子串的数量(Manacher)

    #1589 : 回文子串的数量 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个字符串S,请统计S的所有|S| * (|S| + 1) / 2个子串中(首尾位置不 ...

  2. make编译四

    书写命令 每条规则中的命令和操作系统 Shell 的命令行是一致的. make 会按顺序一条一条的执行命令, 每条命令的开头必须以[Tab]键开头, 除非,命令是紧跟在依赖规则后面的分号后的.在命令行 ...

  3. C#类型基础(1)

    1.“运行时”要求每个类型最终都从 System.Object 类型派生.Object提供了Equals,GetHashCode,ToString,GetType公共方法,并提供MemberwiseC ...

  4. C/C++ 关键字的使用方法详解

    cppreference.com -> C/C++ 关键字 -> 细节 C/C++ 关键字 asm 语法: asm( "instruction" ); asm允许你在你 ...

  5. Python之模块和包(Day21)

    一.Python模块 Python模块(module),是一个Python文件,以.py结尾,包含了Python对象定义和Python语句. 模块让你能够有逻辑的组织你的Python代码段 把相关的代 ...

  6. 使用jQuery方法做任务左右栏移动

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. eclipse连接SqlServer2008(被它搞得惨兮兮)

    建民大叔告诉我要考试做一个系统要求连接SqlServer2008,于是我便开始了“炼狱”,人家连接起来一路绿灯,我却一路红灯所以决定把它记录下来,给后来人提供方便. 第一个红灯: 启动服务后利用cmd ...

  8. 每天一个Linux命令(64)shutdown命令

        shutdown以一种安全的方式关闭系统.     (1)用法:     用法:  shutdown [参数] [时间]     (2)功能:     功能:  系统关机命令,shutdown ...

  9. iOS获取设备IP地址

    项目用到要获取iOS设备的IP地址,有2种方法: 1)第一种比较简单,但是只有当你的设备连接到WIFI时才能获取到IP地址,倘若你的设备用的是流量,那就不行.代码如下: #import <ifa ...

  10. 一个骑行者的独白,很不错,我就转载了。--原名是--<<关于认怂这件事>>

    一个骑行者的独白,很不错,我就转载了.--原名是--<<关于认怂这件事>>   PS:我不知道这些是对是错,但都不曾后悔,或许哪天我在生活面前也怂了,然后跑回大城市乖乖的当个小 ...