一看就会Android之SQLite中事务的使用
2015-10-25 10:19
639 查看
假如现在有一张用户表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()方法即为处理事务的完整方法。
假如现在有一张用户表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()方法即为处理事务的完整方法。
相关文章推荐
- Android开发手记一 NDK编程实例
- AndroidStudio基础教程
- Android ListView添加标头 联系人
- 关于id cannot be resolved or is not a field 的一个解决方法
- android适配器的使用
- Android中的多级联动
- Android 举例说明自己的定义Camera图片和预览,以及前后摄像头切换
- Android开发-动态添加与button响应(手机拨号界面的实现)
- android studio刚启动报错
- android+PHP+mysql开发编码问题解决方案
- android studio搭建 OpenCv
- Windows环境下Android Studio v1.0安装教程
- Android Studio简单设置
- Android 快捷键
- Android 基于google Zxing实现对手机中的二维码进行扫描
- Android开发用到的cmd等命令行
- Android4.3 蓝牙BLE初步
- Android Fragment生命周期深入探究
- Android学习res资源文件
- Android 深入了解 Handler 和 Looper