美文网首页数据库
iOS FMDB 事务操作

iOS FMDB 事务操作

作者: dy_zhang | 来源:发表于2017-09-06 19:20 被阅读538次

    最近又用到了FMDB,对事务操作有了更深刻的认识。sqlite 本身是支持事务操作的,FMDB 作为对 sqlite 的封装也是支持的。那什么是事务操作?简单讲一次 executeUpdate (插入数据,本质是 sqlite3_exec)就是一次事务操作,其具体过程是:开始新事务-->插入数据-->提交事务。我们向数据库中插入多少条数据,这个过程就会执行多少次,显然当插入的数据很多的时候这是非常耗时的。就比如你订了外卖,今天特别饿点了8个菜,结果外卖小哥 freestyle 做好一个菜送一个菜,mmp!你是不是要崩溃了


    大家知道真实的情况是外卖小哥会吧饭菜一次性送给你。
    所以事务操作的原理就是:所有任务执行完成后再将结果一次性提交到数据库

    举个🌰大家看一下:
    有个 Person 类,它有如下信息:



    把 Person 信息保存到数据库,作为对比,同样的数据量(10000组)一个开启事操作另一个不开启:



    对比结果如下(注:模拟器运行):

    从上面的时间看使用事务操作要比不使用节省大量时间,尤其当数据非常多的时候更应该使用事务操作来处理,避免重复的步骤浪费时间。

    使用事务操作的代码(FMDB):

    // 插入数据
    - (void)insertData:(id)data isTransaction:(BOOL)isTransaction {
        BOOL isOpen = [_database open];
        if (isOpen) {
            if (isTransaction) {
                //NSLog(@"**********开始事务操作*************");
                [_database shouldCacheStatements]; // 开启缓存
                [_database beginTransaction]; // 事务操作
                BOOL isRollBack = NO;
                @try {
                    [self performInsertWithData:data];
                }
                @catch (NSException *exception) {
                    isRollBack = YES;
                    [_database rollback]; // 回滚
                }
                @finally {
                    if (!isRollBack) {
                        [_database commit];
                    }
                }
            }else {
                [self performInsertWithData:data];
            }
            [_database close];
        }
    }
    - (void)performInsertWithData:(id)data {
        NSArray *arr = (NSArray *)data;
        BOOL isInsert = NO;
        for (PersonModel *model in arr) {
            NSString *sql = [NSString stringWithFormat:@"insert into %@ values(NULL,'%@',%ld,'%@','%@')",@"PersonClass",model.name,model.age,model.gender,model.role];
            isInsert = [_database executeUpdate:sql];
            //NSLog(@"%@",isInsert ? @"插入成功":@"插入失败");
        }
    }
    

    :isTransaction 是否使用事务操作

    相关文章

      网友评论

        本文标题:iOS FMDB 事务操作

        本文链接:https://www.haomeiwen.com/subject/jwevjxtx.html