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