事物与非事物
事物是一个并发控制的基本单元,所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
事物与非事物,简单的举例来说就是,事物就是把所有的东西打包在一起,一次性处理它。而非事务就是一条一条的来执行并且处理。
数据库存储的路径
- (NSString *)dbPath{
NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"FMDB.sqlite"];
return dbPath;
}
非事务
- 首先创建一个队列
FMDatabaseQueue *dabaseQueue = [FMDatabaseQueue databaseQueueWithPath:[self dbPath]];
- 将一组操作添加到非事物处理中
[dabaseQueue inDatabase:^(FMDatabase *db) {
BOOL iserror = NO;
int temp = -1;
for (int i = 0; i < 10000000; i++) {
iserror = [db executeUpdate:@"insert into stu values (?)",@(i)];
if (!iserror) {//说明iserror == NO插入有问题了。
if (temp == -1) {
temp = i;//在这里记录出错的条数
}
}
}
if (iserror) {
NSLog(@"所有插入操作成功");
}else{
NSLog(@"插入操作失败%d",temp);
}
}];
在这里我们想数据库中插入了10000000条数据,在采用非事物处理的方式时,它会一条一条的想数据库中插入,循环往复,直到把所有的数据插入完毕,耗时比较巨大
事物
还是上面的代码,我们只需要做一些小小的改动就可以实现事物的一个处理
FMDatabaseQueue *dabaseQueue = [FMDatabaseQueue databaseQueueWithPath:[self dbPath]];
//将一组操作添加到非事务处理中
[dabaseQueue inDatabase:^(FMDatabase *db) {
/**
* 操作放入事物中(加入事物操作)
*/
[db beginTransaction];
BOOL iserror = NO;
int temp = -1;
for (int i = 0; i < 10000000; i++) {
iserror = [db executeUpdate:@"insert into stu values (?)",@(i)];
if (!iserror) {//说明iserror == NO插入有问题了。
if (temp == -1) {
temp = i;
}
}
}
if (iserror) {
NSLog(@"所有插入操作成功");
}else{
NSLog(@"插入操作失败%d",temp);
}
/**
* 提交事物
*/
[db commit];
}];
上面的这种方法是通过我们手动把操作添加到事物中,并且手动的提交。
其实FMDB已经为我们封装了一个事物的处理方法
示例代码
创建一个队列
FMDatabaseQueue *dataBaseQueue = [FMDatabaseQueue databaseQueueWithPath:[self dbPath]];
将操作加入到事物中
[dataBaseQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
NSLog(@"开始插入数据");
BOOL iserror = NO;
for (int i = 0; i < 10000000; i++) {
iserror = [db executeUpdate:@"insert into stu values (?)",@(i)];
}
if (iserror) {
NSLog(@"所有操作成功");
}
}];
这个方法在他的内部已经为我们做好了添加操作到事物,和提交事物的操作,我们只需要在方法中添加操作就可以了。
网友评论
NSLog(@"开始插入数据");
BOOL iserror = NO;
for (int i = 0; i < 10000000; i++) {
iserror = [db executeUpdate:@"insert into stu values (?)",@(i)];
}
if (iserror) {
NSLog(@"所有操作成功");
}
}];
你的iserror只是判断了最后一次插入代码情况,这部分代码是不是这样写会好点:
[dataBaseQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
NSLog(@"开始插入数据");
BOOL iserror = NO;
for (int i = 0; i < 10000000; i++) {
iserror = [db executeUpdate:@"insert into stu values (?)",@(i)];
if (!iserror) {
NSLog(@"操作失败");
*rollback = YES;
return;
}
}
}];