上一篇介绍了SQLite的简单用法,现在就来介绍一下数据库事务的简单用法,在使用到数据库的时候,事务处理是非常重要的。
首先android数据库操作效率是非常低的,因为每执行一条数据操作系统默认commit一次,那速度就可想而知了,那数据库事务就可以有效的解决这个问题;其次呢是保证数据的一致性,让一个事务中的所有操作都成功执行,才会被commit。
接下来我们就以模拟转账为例,进行一下操作,看一看数据库事务怎么应用。假如说张三给李四转1000块钱,张三卡里的钱被划扣掉了,然后这时,突然断电了,李四并没有收到钱,这种情况是肯定不被允许的,那就体现了数据库事务的好处,它所要求的是:当张三的钱被划扣过并且李四也收到钱了,这个操作才会执行成功。倘若该事务执行过程中出现了意外而导致任何一方的操作没有执行成功,那所有操作就回滚到执行前的状态,也就是:我当你从没来过。
它涉及到三个很重要的方法:
db.beginTransaction();// 开启事务
db.setTransactionSuccessful();// 标记数据库事务开启成功
db.endTransaction();// 结束事务
接下来代码说明,还用上一篇的那个数据库就行,只需添加一个account字段即可,用来当做账户金额。看一下示例代码:
/**
* 转账业务
*
* @param name1
* 汇款人名称
* @param name2
* 收款人名称
*/
public void transfer(String name1, String name2) {
SQLiteDatabase db = stuHelper.getWritableDatabase();
db.beginTransaction();// 开启事务
try {
// name1的账户减去1000
db.execSQL("update student set account=account-1000 where name=?",
new String[] { name1 });
// name2的账户加上1000
db.execSQL("update student set account=account+1000 where name=?",
new String[] { name2 });
db.setTransactionSuccessful();// 标记数据库事务开启成功
} catch (Exception e) {
// 当转账过程中出现异常,打印log
Log.i("SQLite_Aty:", "哎呀,转账出错了!");
} finally {
db.endTransaction();// 结束事务
}
}
在try代码块中,倘若中间出现了任何异常,该转账操作均不会成功。这样,就达到我们想要的目的了。