批量操作数据库的时候,我们经常会用到事务处理。事务是访问并可能更新数据库各种数据项的数据单元(unit),是恢复和并发的控制的基本单位。
事务具有四个属性。
- 原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
- 一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
- 隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持久性(durability):持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
sqlite支持事务,FMDB也对事务进行了很好的封装。
事务形成的sql语句
触发事务:begin transaction
提交事务:commit transaction
回滚事务:rollback transaction
【FMDB】中关于事务的封装如下:(看看实现方式,一般我们只用到方法)
#pragma mark Transactions
- (BOOL)rollback {
BOOL b = [self executeUpdate:@"rollback transaction"];
if (b) {
_inTransaction = NO;
}
return b;
}
- (BOOL)commit {
BOOL b = [self executeUpdate:@"commit transaction"];
if (b) {
_inTransaction = NO;
}
return b;
}
- (BOOL)beginDeferredTransaction {
BOOL b = [self executeUpdate:@"begin deferred transaction"];
if (b) {
_inTransaction = YES;
}
return b;
}
- (BOOL)beginTransaction {
BOOL b = [self executeUpdate:@"begin exclusive transaction"];
if (b) {
_inTransaction = YES;
}
return b;
}
- (BOOL)inTransaction {
return _inTransaction;
}
在工程里的使用
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
[delegate.db beginTransaction];
BOOL isRollBack = NO;
@try {
/** 开始下载数据 */
[self downLoadData];
}
@catch (NSException *exception) {
isRollBack = YES;
[delegate.db rollback];
}
@finally {
if (!isRollBack) {
[delegate.db commit];
}
}
-downLoadData;方法是实现的数据获取及插入,这里不写了。