FMDB事务的底层实现

在使用基于SQLite的数据库的时候,如果要一次性插入或更新大量数据,则适合使用事务(Transaction)

  1. 开始执行事务
    调用FMDB的开始事务方法,告诉数据库,要开始执行事务
- (BOOL)beginTransaction {
    BOOL b = [self executeUpdate:@"begin exclusive transaction"];
    if (b) {
        _isInTransaction = YES;
    }
    return b;
}
- (BOOL)beginDeferredTransaction {
    BOOL b = [self executeUpdate:@"begin deferred transaction"];
    if (b) {
        _isInTransaction = YES;
    }
    return b;
}
- (BOOL)beginImmediateTransaction {
    
    BOOL b = [self executeUpdate:@"begin immediate transaction"];
    if (b) {
        _isInTransaction = YES;
    }
    
    return b;
}
- (BOOL)beginExclusiveTransaction {
    BOOL b = [self executeUpdate:@"begin exclusive transaction"];
    if (b) {
        _isInTransaction = YES;
    }
    return b;
}

如上所示

  • FMDB开始事务的函数其实是执行开始执行事务的sql代码,根据代码执行的结果,将isInTransaction属性赋值,用于表示当前是否开启事务(则由于容易造成长期阻塞,降低并发性能)
  • 开始执行事务的函数有4个,其中:
    beginTransaction函数对应的不是标准的sqlite意义上的“BEGIN TRANSACTION”,此方法执行的是排他事务,而不是延时事务,排他事务是在开始事务的时候就上锁,延时事务是在使用的时候才会去上锁。
  • beginTransaction和beginExclusiveTransaction两个函数执行同样的逻辑。
  • 如果要使用延时事务,则需要调用beginDeferredTransaction
  • beginImmediateTransaction用于多个线程写入数据库的操作,它回去尝试获取锁,用于实现多线程写入写入数据库事务的操作。
  1. 关闭事务
    在FMDB中,有两个函数是用于关闭事务的
- (BOOL)rollback {
    BOOL b = [self executeUpdate:@"rollback transaction"];
    if (b) {
        _isInTransaction = NO;
    }
    return b;
}
- (BOOL)commit {
    BOOL b =  [self executeUpdate:@"commit transaction"];
    if (b) {
        _isInTransaction = NO;
    }
    return b;
}

如上所示,rollback方法用于回滚并结束事务,commit用于提交更新并结束事务

  1. 实现事务
    其底层实现实际上就是在执行开始事务的时候标识“已经开始事务”,此时写入数据库的操作并不会真正写入数据库,而会在commit的时候统一写入或者在rollback放弃

你可能感兴趣的:(FMDB事务的底层实现)