當(dāng)談到“事務(wù)”時诗赌,我想到了sqlite本身是支持事務(wù)操作的靠闭,F(xiàn)MDB作為sqlite的上層封裝也對事務(wù)進(jìn)行了支持,那么說了這么多給不了解“事務(wù)”這個詞的同學(xué)解釋一下吧:通常一次 sqlite3_exec 就是一次事務(wù),假如你要對數(shù)據(jù)庫中的Stutent表插入新數(shù)據(jù)惫霸,那么該事務(wù)的具體過程是:開始新事物->插入數(shù)據(jù)->提交事務(wù)扛拨,那么當(dāng)我們要往該表內(nèi)插入500條數(shù)據(jù)耘分,如果按常規(guī)操作處理就要執(zhí)行500次“開始新事物->插入數(shù)據(jù)->提交事務(wù)”的過程。
好吧绑警,今天的重點(diǎn)來了,舉個例子:假如北京的一家A工廠接了上海一家B公司的500件產(chǎn)品的訂單求泰,思考一下:A工廠是生產(chǎn)完一件立即就送到B公司還是將500件產(chǎn)品全部生產(chǎn)完成后再送往B公司?答案肯定是后者计盒,因為前者浪費(fèi)了大量的時間渴频、人力物力花費(fèi)在往返于北京和上海之間。同樣這個道理也能用在我們的數(shù)據(jù)庫操作上北启,下面是我自己對使用事務(wù)和不使用事務(wù)的兩種測試:
測試代碼:
下面代碼中總共調(diào)用了三次插入數(shù)據(jù)的方法卜朗,由于第一次調(diào)用過程中包含數(shù)據(jù)庫和表的創(chuàng)建等一系列過程拔第,因此第二三次調(diào)用插入方法計算出的時間才是準(zhǔn)確的。(數(shù)據(jù)庫采用FMDB)
[[TestDataBase sharedInstanceDB] insertData:0 useTransaction:NO];
NSDate *date1 = [NSDate date];
[[TestDataBase sharedInstanceDB] insertData:500 useTransaction:NO];
NSDate *date2 = [NSDate date];
NSTimeInterval a = [date2 timeIntervalSince1970] - [date1 timeIntervalSince1970];
NSLog(@"不使用事務(wù)插入500條數(shù)據(jù)用時%.3f秒",a);
[[TestDataBase sharedInstanceDB] insertData:1000 useTransaction:YES];
NSDate *date3 = [NSDate date];
NSTimeInterval b = [date3 timeIntervalSince1970] - [date2 timeIntervalSince1970];
NSLog(@"使用事務(wù)插入500條數(shù)據(jù)用時%.3f秒",b);
下面是具體的插入實現(xiàn)方法场钉,
useTransaction為真代表使用事務(wù)處理蚊俺,反之不使用
- (void)insertData:(int)fromIndex useTransaction:(BOOL)useTransaction
{
[_dataBase open];
if (useTransaction) {
[_dataBase beginTransaction];
BOOL isRollBack = NO;
@try {
for (int i = fromIndex; i<500+fromIndex; i++) {
NSString *nId = [NSString stringWithFormat:@"%d",i];
NSString *strName = [[NSString alloc] initWithFormat:@"student_%d",i];
NSString *sql = @"INSERT INTO Student (id,student_name) VALUES (?,?)";
BOOL a = [_dataBase executeUpdate:sql,nId,strName];
if (!a) {
NSLog(@"插入失敗1");
}
}
}
@catch (NSException *exception) {
isRollBack = YES;
[_dataBase rollback];
}
@finally {
if (!isRollBack) {
[_dataBase commit];
}
}
}else{
for (int i = fromIndex; i<500+fromIndex; i++) {
NSString *nId = [NSString stringWithFormat:@"%d",i];
NSString *strName = [[NSString alloc] initWithFormat:@"student_%d",i];
NSString *sql = @"INSERT INTO Student (id,student_name) VALUES (?,?)";
BOOL a = [_dataBase executeUpdate:sql,nId,strName];
if (!a) {
NSLog(@"插入失敗2");
}
}
}
[_dataBase close];
}
從上面這些真實的數(shù)據(jù)來看,你就應(yīng)該知道當(dāng)你批量更新數(shù)據(jù)庫的時候應(yīng)該利用事務(wù)處理逛万!
總結(jié):使用事務(wù)處理就是將所有任務(wù)執(zhí)行完成以后將結(jié)果一次性提交到數(shù)據(jù)庫泳猬,如果此過程出現(xiàn)異常則會執(zhí)行回滾操作,這樣節(jié)省了大量的重復(fù)提交環(huán)節(jié)所浪費(fèi)的時間