以前知道的太少了,这样大量的数据更新居然没有用到数据库事务,怪不得时间开销这么高。
工作二后来优化了一下,加入了sqlite3的事务,效果十分明显,70秒的数据库生成时间缩短到了1.5秒。
事务(transaction)的原理是,对数据库进行更新的语句先储存起来,储存到一定程度将这些语句一并提交(commit),如果尚未提交,但中途出现了异常,则这些语句都可以撤回(rollback)。
使用事务有两个非常明显的好处:
1、将大量更新语句合并到一起,极大的缩短了访问数据库的次数,如此大量提高了效率和吞吐量。例如本人的“工作二”,将八万多次数据库更新合并到一次提交,原操作时间70秒降低到了1.5秒,效率提高的幅度简直可怕。
2、避免了一些非常恶心的情况,比如同样一个对象有许多不同的属性都要插入到数据库的不同表中,需要多句sql更新才能完成操作。如果操作中途出现了异常,则可能某个对象只有一半的数据输入了数据库,还有另一半是空白的,这还不如完全没输入。而事务的rollback就是干这个用的。
FMDB下使用事务方式十分简单:
建立数据库db
FMDatabase *db = [FMDatabase databaseWithPath:path];
事务开始
[db beginTransaction];
BOOL isRollback = NO;
具体数据库操作可以包在@try中,如果捕获到异常就rollback
@try {
// 数据库操作代码
}
@catch (NSException *exception) {
isRollback = YES;
[db rollback];
}
@finally {
if (isRollback == NO) {
[db commit];
}
}
finally