事务(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技术博客: