Android 数据库的事务

什么是数据库的事务

事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始和事务结束之间执行的全体操作组成。

特性

事务是恢复和并发控制的基本单位。

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability)。指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

    db.beginTransaction();
    try {
        ...
        db.setTransactionSuccessful();
    } catch (Exception e) {
        Toast.makeText(this, "产生异常,事务回滚", 0).show();
    } finally {
        db.endTransaction();
    }

1、修改数据库

将之前创建的person.db数据库添加一列account来记录帐务

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.i(TAG, "数据库的版本发生变化了");
        db.execSQL("alter table person add  account varchar(20)");
    }

并修改PersonSQLiteOpenHelper方法中的版本号,将其加1

    public PersonSQLiteOpenHelper(Context context) {
        // context 上下文
        // person.db 数据库文件名称
        // factory 游标工厂
        // version 数据库的版本号 从1开始
        super(context, "person.db", null, 5);
        // TODO Auto-generated constructor stub
    }

接着单元测试运行TestPersonDB.java中的testCreateDB方法

2、数据库事务操作

案例:
张三给王五汇款
1. 张三 account - 1000
2. 王五 account + 1000

    public void testTransaction() throws Exception {
        PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext());
        SQLiteDatabase db = helper.getReadableDatabase();
        // 开始数据库的事务
        db.beginTransaction();
        try {
            db.execSQL("update person set account=account-1000 where name=?",
                    new Object[] { "zhangsan" });
            
            int i = 2/0; //制造异常测试事务操作

            db.execSQL("update person set account=account+1000 where name=?",
                    new Object[] { "wangwu" });

            // 标记数据库事务执行成功
            db.setTransactionSuccessful();

        } catch (Exception e) {

        } finally {
            db.endTransaction();
            db.close();

        }

    }

最后使用sqlite3查看数据库person表中的数据,转账没有成功,张三和王五的钱都没有变化

posted @ 2016-06-12 23:23  wuyudong  阅读(1093)  评论(0编辑  收藏  举报
Top_arrow