rollback的作用

#pragma mark - 以队列的形式添加

// 以队列的形式添加数据FMDB比较常用的添加方式

// FMDB不支持多个线程同时操作,所以一般以串行的方式实现相关操作

- (IBAction)insertManyStudent:(id)sender {

    // 第一步:打开数据库

    [self.dataBase open];

    // 第二步:创建操作队列

    FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:self.filePath];

    // 标识:记录是否操作成功

    __block BOOL isSucceed = YES;

    // 第三步:把所需要的事情打包放在队列中

    [queue inTransaction:^(FMDatabase *db, BOOL *rollback) {

        // 串行队列  

        isSucceed = [db executeUpdate:@"insert into t_student(name,age,sex) values(?,?,?)", @"gblw", @38, @"nan"] && isSucceed;

        isSucceed = [db executeUpdate:@"insert into t_student(name,age,sex) values(?,?,?)", @"black", @22, @"nv"] && isSucceed;

        isSucceed = [db executeUpdate:@"insert into t_student(name,age,sex) values(?,?,?)", @"-1", @69, @"nan"] && isSucceed;

        // 如果有错误,就会将它返回

        if (!isSucceed) {

            // block返回的参数 rollback进行处理 (bool类型的指针)

            *rollback = YES;

            return ;

        }

        // rollback 回滚的意思。 就是数据库里做修改后( update ,insert , delete)未 commit 之前 使用 rollback 可以恢复数据到修改之前。

        // 这句代码,假设在执行第一句执行完后,数据库服务器故障,抛出异常了,第二句就没有执行。这时候数据库的情况就是:id1name更新了,id2name没有更新。假设业务逻辑不能容忍这种只执行一半的情况,那么就应该rollback,把id1name恢复到一切执行之前的情况。

        // 如果业务逻辑可以容忍这种只执行一半SQL的行为,那就不需要rollback

        // 数据库事务控制的精髓就一句话:对于一堆sql语句来说,要么都执行,要么都不执行。其中要么都不执行的部分,就是用rollback实现的

    }];

    [self.dataBase close];

}

 

原文地址:https://www.cnblogs.com/crazygeek/p/5543385.html