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放弃
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容