當談到“事務”時,我想到了sqlite本身是支持事務操作的,FMDB作爲sqlite的上層封裝也對事務進行了支持,那麼說了這麼多給不瞭解“事務”這個詞的同學解釋一下吧:通常一次 sqlite3_exec 就是一次事務,假如你要對數據庫中的Stutent表插入新數據,那麼該事務的具體過程是:開始新事物->插入數據->提交事務,那麼當我們要往該表內插入500條數據,如果按常規操作處理就要執行500次“開始新事物->插入數據->提交事務”的過程。
好吧,今天的重點來了,舉個例子:假如北京的一家A工廠接了上海一家B公司的500件產品的訂單,思考一下:A工廠是生產完一件立即就送到B公司還是將500件產品全部生產完成後再送往B公司?答案肯定是後者,因爲前者浪費了大量的時間、人力物力花費在往返於北京和上海之間。同樣這個道理也能用在我們的數據庫操作上。
測試代碼:
NSDate *date1 = [NSDate date];
//0.453秒
for (int i = 0; i < 500; i ++) {
[self.queue inDatabase:^(FMDatabase *db) {
[self insertItemWithDB:db];
}];
}
//0.286秒
[self.queue inDatabase:^(FMDatabase *db) {
for (int i = 0; i < 500; i ++) {
[self insertItemWithDB:db];
}
}];
//0.303秒
for (int i = 0 ; i < 500; i ++) {
[self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
[self insertItemWithDB:db];
}];
}
//0.015秒
[self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
for (int i = 0 ; i < 500; i ++) {
[self insertItemWithDB:db];
}
}];
NSDate *date2 = [NSDate date];
NSTimeInterval a = [date2 timeIntervalSince1970] - [date1 timeIntervalSince1970];
NSLog(@"插入500條數據用時%.3f秒",a);