事物與非事物
事物是一個(gè)并發(fā)控制的基本單元,所謂的事務(wù)页屠,它是一個(gè)操作序列粹胯,這些操作要么都執(zhí)行,要么都不執(zhí)行辰企,它是一個(gè)不可分割的工作單位风纠。
事物與非事物,簡(jiǎn)單的舉例來(lái)說(shuō)就是牢贸,事物就是把所有的東西打包在一起竹观,一次性處理它。而非事務(wù)就是一條一條的來(lái)執(zhí)行并且處理潜索。
數(shù)據(jù)庫(kù)存儲(chǔ)的路徑
- (NSString *)dbPath{
NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"FMDB.sqlite"];
return dbPath;
}
非事務(wù)
- 首先創(chuàng)建一個(gè)隊(duì)列
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) {//說(shuō)明iserror == NO插入有問(wèn)題了臭增。
if (temp == -1) {
temp = i;//在這里記錄出錯(cuò)的條數(shù)
}
}
}
if (iserror) {
NSLog(@"所有插入操作成功");
}else{
NSLog(@"插入操作失敗%d",temp);
}
}];
在這里我們想數(shù)據(jù)庫(kù)中插入了10000000條數(shù)據(jù),在采用非事物處理的方式時(shí)竹习,它會(huì)一條一條的想數(shù)據(jù)庫(kù)中插入誊抛,循環(huán)往復(fù),直到把所有的數(shù)據(jù)插入完畢整陌,耗時(shí)比較巨大
事物
還是上面的代碼拗窃,我們只需要做一些小小的改動(dòng)就可以實(shí)現(xiàn)事物的一個(gè)處理
FMDatabaseQueue *dabaseQueue = [FMDatabaseQueue databaseQueueWithPath:[self dbPath]];
//將一組操作添加到非事務(wù)處理中
[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) {//說(shuō)明iserror == NO插入有問(wèn)題了昔园。
if (temp == -1) {
temp = i;
}
}
}
if (iserror) {
NSLog(@"所有插入操作成功");
}else{
NSLog(@"插入操作失敗%d",temp);
}
/**
* 提交事物
*/
[db commit];
}];
上面的這種方法是通過(guò)我們手動(dòng)把操作添加到事物中,并且手動(dòng)的提交并炮。
其實(shí)FMDB已經(jīng)為我們封裝了一個(gè)事物的處理方法
示例代碼
創(chuàng)建一個(gè)隊(duì)列
FMDatabaseQueue *dataBaseQueue = [FMDatabaseQueue databaseQueueWithPath:[self dbPath]];
將操作加入到事物中
[dataBaseQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
NSLog(@"開(kāi)始插入數(shù)據(jù)");
BOOL iserror = NO;
for (int i = 0; i < 10000000; i++) {
iserror = [db executeUpdate:@"insert into stu values (?)",@(i)];
}
if (iserror) {
NSLog(@"所有操作成功");
}
}];
這個(gè)方法在他的內(nèi)部已經(jīng)為我們做好了添加操作到事物默刚,和提交事物的操作,我們只需要在方法中添加操作就可以了逃魄。