在使用基于SQLite的数据库的时候,如果要一次性插入或更新大量数据,则适合使用事务(Transaction)
- 开始执行事务
调用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用于多个线程写入数据库的操作,它回去尝试获取锁,用于实现多线程写入写入数据库事务的操作。
- 关闭事务
在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用于提交更新并结束事务
- 实现事务
其底层实现实际上就是在执行开始事务的时候标识“已经开始事务”,此时写入数据库的操作并不会真正写入数据库,而会在commit的时候统一写入或者在rollback放弃