一看就会Android之SQLite中事务的使用

来源:互联网 发布:韩国作曲家甘雨知乎 编辑:程序博客网 时间:2024/05/11 12:54


假如现在有一张用户表user,该表中有一个字段为account代表金额,现在要通过事务来实现转账功能,应该怎么做呢?(payment4()方法为处理事务的完整方法)

UserDao(定义的是用关于用户表操作的一系列方法)类中定义一个转账的方法如下:

public void payment1(){

//通过SQLiteOpenHelper子类实例获取SQLiteDataBase对象db

db =dbOpenHelper.getWritableDatabase();

db.execSQL(“update user set account = account -10 whereuserid=1”);

db.execSQL(“update user set account = account+10 whereuserid=2”);

}

payment1()方法是传统的未添加事务的方法。

public void payment2(){

//通过SQLiteOpenHelper子类实例获取SQLiteDataBase对象db

db =dbOpenHelper.getWritableDatabase();

db.beginTransaction();//开启事务

db.execSQL(“update user set account = account -10 whereuserid=1”);

db.execSQL(“update user set account = account+10 whereuserid=2”);

db.endTransaction();//结束事务

}

payment2()方法是添加了事务的方法,对于事务我们知道不是回滚,就是提交,那么payment2()方法中的事务是会回滚还是会提交呢?答案是会回滚,即直接执行payment2()方法将无法完成转账操作,因为系统默认事务为回滚,为了让事务提交我们必须调用setTransactionSuccessful()方法来设置成功时提交事务,如下:

public void payment3(){

//通过SQLiteOpenHelper子类实例获取SQLiteDataBase对象db

db =dbOpenHelper.getWritableDatabase();

db.beginTransaction();//开启事务

db.execSQL(“update user set account = account -10 whereuserid=1”);

db.execSQL(“update user set account = account+10 whereuserid=2”);

db.setTransactionSuccessful()//设置事务成功后为提交状态

db.endTransaction();//结束事务

}

执行payment3()方法即可完成转账操作,但是仍然存在问题:如果事务都执行成功当然没什么问题,假如在执行第二条sql语句时因意外情况而执行失败,那么系统就会报出异常,由于结束事务的操作无法被调用,所以事务也不会进行回滚,但是事实第一条sql语句已经正常执行了,所以payment3()方法只能实现提交不能实现回滚,因此我们还需做如下的改变:

public void payment4(){

//通过SQLiteOpenHelper子类实例获取SQLiteDataBase对象db

db =dbOpenHelper.getWritableDatabase();

db.beginTransaction();//开启事务

try{

db.execSQL(“update user set account = account -10 whereuserid=1”);

db.execSQL(“update user set account = account+10 whereuserid=2”);

db.setTransactionSuccessful()//设置事务成功后为提交状态

}finally{

db.endTransaction();//结束事务

}

}

payment4()方法中无论那个sql操作出现异常,事务都会被结束,并且异常结束事务的时候db.setTransactionSuccessful();也不会被执行到,所以系统会回滚事务。

---------------------payment4()方法即为处理事务的完整方法。

1 0