Android学习笔记(8)——Sqlite数据库的事务问题

事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

一个浅显的例子,例如银行转账工作:从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行。不能说如果执行完一个账号的扣款之后,突然停电了,另外一个账号没有进行增款操作。

类似这样的情况,我们都应该把它们看成一个事务。事务是数据库维护数据一致性的单位,并且在每个事务结束时,都能保持数据一致性。

事务应该遵循ACID特征,即:

  • Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。
  • Consistency(一致性):只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。
  • Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。
  • Durability(持久性):事务结束后,事务处理的结果必须能够得到固化。

在Sqlite中我们采用如下三段来处理事务:

  • db.beginTransaction()
  • setTransactionSuccessful()
  • db.endTransaction()

参考代码如下(lisi向zhangsan打钱1000块的例子)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
String str;
    public void testTransaction() throws Exception {
        PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext());
        SQLiteDatabase db = helper.getWritableDatabase();
        //开始数据库的事务
        db.beginTransaction();
        try {
            db.execSQL("update person set account=account-1000 where name=?",
                    new Object[] { "zhangsan" });
            str.equals("123");
            db.execSQL("update person set account=account+1000 where name=?",
                    new Object[] { "lisi" });
            //设置数据库事务执行成功的flag
            db.setTransactionSuccessful();
        } finally {
            //如果执行成功(flag被设置,则commit(),否则rollback回滚
            db.endTransaction();
        }
    }

其中的str.equals(“123″);语句会出现空指针错误。这里可以用于模拟程序异常中断,并且查看结果我们发现不会出现sql语句只执行一部分的情况。

搬运自本人博客,xge技术博客

http://www.xgezhang.com/android_sqlite_transaction.html

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。