事物与非事物
事物是一个并发控制的基本单元,所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。 事物与非事物,简单的举例来说就是,事物就是把所有的东西打包在一起,一次性处理它。而非事务就是一条一条的来执行并且处理。 数据库存储的路径
- (NSString *)dbPath{NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"FMDB.sqlite"];return dbPath;
}
复制代码
非事务
- 首先创建一个队列
FMDatabaseQueue *dabaseQueue = [FMDatabaseQueue databaseQueueWithPath:[self dbPath]];
复制代码
- 将一组操作添加到非事物处理中
[dabaseQueue inDatabase:^(FMDatabase *db) {BOOL iserror = NO;int temp = -1;for (int i = 0; i < 10000000; i++) {iserror = [db executeUpdate:@"insert into stu values (?)",@(i)];if (!iserror) {//说明iserror == NO插入有问题了。if (temp == -1) {temp = i;//在这里记录出错的条数}}}if (iserror) {NSLog(@"所有插入操作成功");}else{NSLog(@"插入操作失败%d",temp);}}];
复制代码
在这里我们想数据库中插入了10000000条数据,在采用非事物处理的方式时,它会一条一条的想数据库中插入,循环往复,直到把所有的数据插入完毕,耗时比较巨大
事物
还是上面的代码,我们只需要做一些小小的改动就可以实现事物的一个处理
FMDatabaseQueue *dabaseQueue = [FMDatabaseQueue databaseQueueWithPath:[self dbPath]];//将一组操作添加到非事务处理中[dabaseQueue inDatabase:^(FMDatabase *db) {/*** 操作放入事物中(加入事物操作)*/[db beginTransaction];BOOL iserror = NO;int temp = -1;for (int i = 0; i < 10000000; i++) {iserror = [db executeUpdate:@"insert into stu values (?)",@(i)];if (!iserror) {//说明iserror == NO插入有问题了。if (temp == -1) {temp = i;}}}if (iserror) {NSLog(@"所有插入操作成功");}else{NSLog(@"插入操作失败%d",temp);}
/**
* 提交事物
*/[db commit];}];
复制代码
上面的这种方法是通过我们手动把操作添加到事物中,并且手动的提交。 其实FMDB已经为我们封装了一个事物的处理方法 示例代码 创建一个队列
FMDatabaseQueue *dataBaseQueue = [FMDatabaseQueue databaseQueueWithPath:[self dbPath]];
复制代码
将操作加入到事物中
[dataBaseQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {NSLog(@"开始插入数据");BOOL iserror = NO;for (int i = 0; i < 10000000; i++) {iserror = [db executeUpdate:@"insert into stu values (?)",@(i)];}if (iserror) {NSLog(@"所有操作成功");}}];
复制代码
这个方法在他的内部已经为我们做好了添加操作到事物,和提交事物的操作,我们只需要在方法中添加操作就可以了。