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块是为了避免某个语句执行发生错误导致程序的意外停止 后面结束事务的操作没执行