ios数据库sqlite-第三方框架FMDB,关于线程安全的事务处理
导入sqlite3数据库和第三方框架FMDB
// 1.获取沙盒路径 NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; path = [path stringByAppendingPathComponent:@"FMDB.sqlite"]; NSLog(@"%@",path); //2.创建FMDBDataBaseQueue对象并打开() FMDatabaseQueue * queue = [[FMDatabaseQueue alloc]initWithPath:path]; [queue inDatabase:^(FMDatabase *db) { NSString * createTable = @"create table if not exists t_person(person_id integer primary key autoincrement,person_name varchar,person_age integer)";// 没有primary key会创建失败 BOOL createFlag = [db executeUpdate:createTable]; if (createFlag) { NSLog(@"创建成功"); }else{ NSLog(@"创建失败"); } }]; // // 3.增 // [queue inDatabase:^(FMDatabase *db) { // NSString * insert = @"insert into t_person(person_name,person_age)values(?,?)"; // for (int i = 0; i < 3; i++) { // NSString * name = [NSString stringWithFormat:@"jack%i",i]; //// int age = 20+i; // NSString * age = [NSString stringWithFormat:@"%i",20+i]; // //// NSLog(@"%@,%@",name,age); // BOOL insertFlag = [db executeUpdate:insert,name,age]; // if (insertFlag) { // NSLog(@"插入数据成功"); // }else{ // NSLog(@"插入数据失败"); // } // } // // }]; // 4.改 [queue inDatabase:^(FMDatabase *db) { NSString * changeData = @"update t_person set person_age = 99 where person_id = 3"; [db executeUpdate:changeData]; }]; // 5.查 [queue inDatabase:^(FMDatabase *db) { NSString * select = @"select * from t_person"; FMResultSet * resultSet = [db executeQuery:select]; }]; // 第一种情况 线程安全,解决同时取钱透支问题(上面解决) // 第二种情况 转账:钱划出去了,进账:钱划进来,转出去了,但因为网络断网或者程序出错等原因未到指定账户的问题(下面解决) // 创建fmdbDataBase对象并打开 FMDatabase * db = [[FMDatabase alloc]initWithPath:path]; [db open]; //买书操作 // 1>扣钱 [db beginDeferredTransaction];//开启事务 NSString * minusSql = @"update t_money set money=money-10"; BOOL deletaFlag = [db executeUpdate:minusSql]; NSString * addSql = @"insert into t_person (person_name,person_age)values('语文',80)"; BOOL addFlag = [db executeUpdate:addSql]; // 只有都执行成功了才执行,如果有一条不成功就“回滚” if (deletaFlag&&addFlag) { [db commit];// 提交事务 NSLog(@"commit"); }else{ [db rollback];// 回滚事务 NSLog(@"rollback"); } } // 第一种情况 线程安全,解决同时取钱透支问题(上面解决) // 第二种情况 转账:钱划出去了,进账:钱划进来,转出去了,但因为网络断网或者程序出错等原因未到指定账户的问题(下面解决) // 第一种情况 线程安全,解决同时取钱透支问题(上面解决) // 第二种情况 转账:钱划出去了,进账:钱划进来,转出去了,但因为网络断网或者程序出错等原因未到指定账户的问题(下面解决) // 第一种情况 线程安全,解决同时取钱透支问题(上面解决) // 第二种情况 转账:钱划出去了,进账:钱划进来,转出去了,但因为网络断网或者程序出错等原因未到指定账户的问题(下面解决) // 第一种情况 线程安全,解决同时取钱透支问题(上面解决) // 第二种情况 转账:钱划出去了,进账:钱划进来,转出去了,但因为网络断网或者程序出错等原因未到指定账户的问题(下面解决) // 第一种情况 线程安全,解决同时取钱透支问题(上面解决) // 第二种情况 转账:钱划出去了,进账:钱划进来,转出去了,但因为网络断网或者程序出错等原因未到指定账户的问题(下面解决)
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。