一看就会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()方法即为处理事务的完整方法。
- 一看就会Android之SQLite中事务的使用
- 一看就会Android之SQLite数据库的使用思路
- 一看就会Android之开发自定义的View
- 一看就会Android之手机震动的设置
- 一看就会Android之手机系统音量的设置
- 一看就会Android之分组列表组件ExpandableListView的使用
- 一看就会Android之网格视图GridView的使用及监听
- 一看就会Android之列表视图组件ListView结合Adapter的使用及监听
- 一看就会Android之BroadcastReceiver
- thinkphp curd的事务回滚 一看就会
- thinkphp curd的事务回滚 一看就会
- Android DataBinding一看就会
- 一看就会Android之用户选择列表项Spinner
- 一看就会Android之TextView,EditText以及CheckedTextView
- 一看就会Android之实现带小图标的Toast
- 一看就会Android之单选按钮和复选框的事件监听
- 一看就会Android之View类和ViewGroup的关系
- 一看就会Android之按钮Button和图片按钮ImageButton的用法
- 栈的基本操作(顺序表)
- iOS JSON的选项NSJSONReadingMutableLeaves
- Codeforces 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest I题(模拟)
- 为经典版eclipse增加web and JavaEE插件
- Gson解析原理概述
- 一看就会Android之SQLite中事务的使用
- 浅谈计算机中的存储模型-(虚拟存储)
- Noip2013火柴排队题解
- LeetCode 089 Gray Code
- Makefile
- Libev源码分析02:Libev中的IO监视器
- HIHO Drinking Game
- UML之用例图
- 二叉树中序遍历的三种方法