Android SQLite 事务
所谓事务,就是一系列的动作,要么都成功,要么都失败,即使有一个成功,那也是失败,即使只有一个失败,那也是失败
SQLite 事务 就是 SQLite 支持多条 SQL 语句一起按照提交的顺序执行,这个过程中如果有一条执行失败,那么就不会继续执行,而且之前已经执行的也不算数,就像从来没提交过任何语句一样
写在事务里的所有数据库操作都成功,事务提交,否则,事务回滚,就是回到前面的状态——未执行数据库操作的时候
Android 通常把事务写在文件 data/data/<包名>/database/ 目录下名为 xxx.db-journal
为什么要有事务
数据库是面向多个用户的,如果每个时刻只有一名用户在操作数据库其它用户需要等待
这很影响数据库资源的使用
但多个人并发访问又容易发生问题,比如 A 用户查询某种表时井没有找到 X 项
而在该用户还没完成操作之前;另一个用户插入了 X 项而 A 依旧认为没有 X 项
举个形象的例子
A 给 B 转 100 块那么 A 的存储要减 100 ,B 的存款也增加 100,两个条件要同时满足才能完成
完成交易(提交事务)
如果 B 账户的钱没有增加但是 A 已经扣了 100 块这样显然是不可以的
所以要把 A 的 100 块返还给他就是恢复原样(事务回滚)
public void transaction() { SqliteDatabase db = dbOpenHelper.getwritableDatabase(); // 开启事务 db.begintransaction(); try { db.execSQL("update person set amount amount -10 where personid =1"); db.execSQL("update person set amount = amount +10"); //设置事务标志为 true,表示提交事务 db.settransactionSuccessful(); } finally{ //结束事务 db.endtransaction(); } }
相关方法介绍
| 方法 | 说明 |
|---|---|
| db.begintransaction() | 开启事务 |
| db.endTransaction() | 结束事务 |
结束事务的结果有两种 事务回滚 或者 提交 ,而决定回滚还是提交决定与一个标记默认为 false,即回滚
所以想提交的话需要调 settransactionSuccessfu() 设置为 true
使用 finally块是为了避免某个语句执行发生错误导致程序的意外停止 后面结束事务的操作没执行