关闭

Sqlite事务理解

标签: sqlite
774人阅读 评论(0) 收藏 举报
分类:

大家在使用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结束事务时,发现事务没有标记完成。就不提交而是回滚。

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

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

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5732次
    • 积分:204
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:1篇
    • 译文:0篇
    • 评论:14条
    文章分类
    最新评论