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

你可能感兴趣的:(Java,android,sqlite,事务)