天天看点

Android复习练习十(SQLite的事务机制)

一、安卓下的事务

事务一般用于这样一种状况: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秒的样子