Sqlite事务理解

原创 2016年06月02日 09:47:39

大家在使用sqlite的时候应该都知道每一条操作都是通过一个SQL语句来完成的,例如:

SQLiteDatabase db = ...;
db.execSQL("insert into person (name, age) values(?,?)", new Object[]{"张三", 4});
这句的意思大家都知道,没错就是往person表里面插入一条数据

不过大家平时在使用的使用一般都是这样用的:
db.beginTransaction();
try {
    db.execSQL("insert into person (name, age) values(?,?)", new Object[]{"张三", 4});
    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
    db.close();
}

当然了,大家都知道这是开启事务如果事务部成功到结束事务的时候就回滚而非提交,很多人都能说出来但是却不知道意思。

经过多番百度,我终于找到了。
如果把上面的代码改成这样:
db.beginTransaction(); // 开启事务
try {
    db.execSQL("insert into person (name, age) values(?,?)", new Object[]{"张三", 4});

    db.execSQL("update person set name=? where personid=?", new Object[]{"李四", 1});

    db.setTransactionSuccessful(); // 标记事务完成
} finally {
    db.endTransaction(); // 结束事务
    db.close();
}

没错就是同时做了两条操作。这样就能体现事务的作用了:只要这两条操作有一条出了异常db.setTransactionSuccessful()就不会执行了。到finally结束事务时,发现事务没有标记完成。就不提交而是回滚。

回滚 就是还原(加入我第一条操作成功了,而第二条操作异常了,但是要求是两条都成功才能去改数据库,如果没有回滚,第一条已经改了数据库了,而第二条的操作没起作用,岂不是智能去进行数据库操作才能补救了吗?这就有点太过坑爹了。不过如果回滚了,那么第一条修改的数据库那条数据就会还原为修改之前的状态了)

可能这样解释不太明白,以下是我从百度上找来的一段解释也是帮助了我理解的:

一组业务整体处理的行为叫一个事务。这一组的业务都能成功处理,我们就可以把这个事务提交来保存你已做的行为结果。但如果一组中有任何的差错出现的话,我们就认为这事务不成功,需要回滚来撤消之前的操作。举例:你去银行转账,转账我们有两步吧,从你账户中取出钱再往他账户中加钱。那这两步银行是必须要确保正确无误的进行的。要被看做成一个事务。其中任何一步出错就算是转账失败,但可能你这时是已经从你账户中扣了钱了,又没往他账户里加
钱?怎么办算了?你不肯吧。所以银行会事务回滚,不保存你刚才的操作,即恢复复到你没转账之前的状态。

相关文章推荐

sqlite的事务和锁,很透彻的讲解 【转】

原文:sqlite的事务和锁 http://3y.uu456.com/bp-877d38906bec097sf46se240-1.html事务事务定义了一组SQL命令的边界,这组命令或者作为一个整体...

sqlite3使用事务处理

sqlite3使用事务处理[zz] 标签: sqlite数据库insert测试磁盘sql 2010-09-24 12:10 10890人阅读 评论(1) 收藏 举报  分类: ...
  • haiross
  • haiross
  • 2015年12月22日 14:37
  • 1808

SQLITE3的锁以及事务

关于延时性事务和独占性事务的区别如下:         在SQLite 3.0.8或更高版本中,事务可以是延迟的,即时的或者独占的。“延迟的”即是说在数据库第一次被访问之前不获得锁。 这样就会延迟事...

Android在SQLite中使用事务

使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果为成功则提交事务,否则回滚...
  • howlaa
  • howlaa
  • 2013年12月16日 10:56
  • 4576

sqlite处理事务的一个例子

事务在数据库中是一个重要的概念,使用事务可以保证数据的统一和完整性。同时也可以提高效率。拿我们上面创建的persons表来说,假设我要一次插入20个人的名字才算是操作成功,那么,在不使用事务的情况下,...
  • Mamong
  • Mamong
  • 2012年11月29日 22:08
  • 8720

sqlite的事务回滚

@try {         if (sqlite3_exec(_db, "begin", NULL, NULL, NULL)==SQLITE_OK) {             NS...

Android SQLite 事务处理

最近在做android项目的时候遇到一个问题,应用程序初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就...

C#通过操作注册表检测office版本

在编写毕业论文辅助编辑软件时,需要检测用户是否安装office以及office的版本,后来在网上找到通过注册表检测的方法,不过由于Windows32位软件和64位软件操作的注册表是不同的,关于这个问题...

SQLite表‘外观’类生成器

SqlGeneratorAPP比较简单或者APP数据库操作比较少, 简单的几张表, 少量的数据存储。 这个时候其实没有必要去使用第三方的ORM库 需要去学习第三方ORM库, 增加学习成本, 也会一定程...
  • Tibib
  • Tibib
  • 2016年09月06日 08:56
  • 267

vb6 sqlite 事务方式数据库编程

  • 2015年09月16日 17:05
  • 295KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Sqlite事务理解
举报原因:
原因补充:

(最多只允许输入30个字)