一、安卓下的事务
事务一般用于这样一种状况:A和B分别在银行一个自己的账户,有一天A要给B汇1000块,那么对应于SQL的操作语句也就是:
update account set money=money-1000 where name = 'A';
update account set money=money+1000 where name='B;
如果正常情况下,当然是没有问题的,但是问题如果A给B汇款完,在B还没有收到款项时,ATM机挂掉了怎么办,这时A的账户少了1000,而B的账户还没有收到这1000块,那么着1000块就蒸发掉了?那么这里就需要事务机制来解决,保证这两句要么同时执行,要么同时不执行。A
Android中的事务操作是比较简单的,主要分为三根步骤:
1.设置事务的起始:(假设db是SQLiteDatebase对象)
db.beginTransaction();
2.设置事务的成功标记点
db.setTransactionSuccessful();
3.设置事务的结束,这个一般放在finally块中执行
finally{
db.endTransaction();
}
机制是:如果事务正常的执行到了成功标记点,那么表示正常,如果事务没有执行到成功标记点就结束了,那么将执行执行的操作都回滚到事务起始的状态
代码如下:
public void testTransaction() {
PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(
getContext());
SQLiteDatabase db = openHelper.getWritableDatabase();
if (db.isOpen()) {
try {
// 开启事务
db.beginTransaction();
// 1.从张三账户中扣1000块
db.execSQL("update person set balance = balance-1000 where name='zhangsan';");
// ATM机挂掉了
int result = 10 / 0;
// 2.向李四账户中扣1000块
db.execSQL("update person set balance = balance+1000 where name='lisi';");
//设置如果到这里了,则标志事务成功
db.setTransactionSuccessful();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//停止事务
db.endTransaction();
}
db.close();
}
}
二、事务的一些用法
事务机制可以优化数据库的性能,大约能提升10倍的样子,比如说要执行10000条数据库插入操作,如果单一的写的话,每一条插入执行都需要打开和关闭数据库连接一次,这种物理上的操作是非常耗时的,大量的时间都被浪费在打开和关闭上了,但是如果用事务将这10000条操作包含起来,那么这一万条操作成功执行指挥打开和关闭一次数据库,这就节省了大量的时间。
这里给出两个例子:
使用事务之前的耗时的例子:
public void testTransactionInsert() {
PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(
getContext());
SQLiteDatabase db = openHelper.getWritableDatabase();
if (db.isOpen()) {
// 1.记录当前时间
long start = System.currentTimeMillis();
// 2.开始添加数据,插入一万条数据
for (int i = 0; i < 10000; i++) {
db.execSQL("insert into person(name,age,balance) values('wang"
+ i + "'," + i + 10 + "," + (i + 10000) + ");");
}
// 3.记录结束时间
long end = System.currentTimeMillis();
long diff = end - start;
System.out.println("使用事务之前耗时:" + diff + "毫秒");
db.close();
}
}
耗时:09-02 03:00:12.267: I/System.out(373): 使用事务之前耗时:13576毫秒,13.5秒的样子
使用事务之后的耗时的例子:
public void testTransactionInsert() {
PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(
getContext());
SQLiteDatabase db = openHelper.getWritableDatabase();
if (db.isOpen()) {
try {
db.beginTransaction();// 开始事务
// 1.记录当前时间
long start = System.currentTimeMillis();
// 2.开始添加数据,插入一万条数据
for (int i = 0; i < 10000; i++) {
db.execSQL("insert into person(name,age,balance) values('wang"
+ i + "'," + i + 10 + "," + (i + 10000) + ");");
}
db.setTransactionSuccessful();// 设置成功记录节点
// 3.记录结束时间
long end = System.currentTimeMillis();
long diff = end - start;
System.out.println("使用事务之前耗时:" + diff + "毫秒");
} catch (SQLException e) {
e.printStackTrace();
} finally {
db.endTransaction();// 设置事务结束点
}
db.close();
}
}
耗时:09-02 03:03:33.900: I/System.out(2113): 使用事务之前耗时:2648毫秒,2.6秒的样子