對sqlite的多線程訪問數(shù)據(jù)安全等問題一直困惑不解屿笼,數(shù)據(jù)庫是存放數(shù)據(jù)的地方,業(yè)務(wù)數(shù)據(jù)和基礎(chǔ)數(shù)據(jù)有可能都會存放在同一個數(shù)據(jù)庫中帚稠,數(shù)據(jù)庫的多線程訪問帶來的數(shù)據(jù)安全問題主要體現(xiàn)在數(shù)據(jù)的錯亂抬伺。
所謂數(shù)據(jù)的錯亂,指的就是讀寫順序錯誤彤断,造成本來應(yīng)該讀取A數(shù)據(jù),結(jié)果讀取的是B數(shù)據(jù)易迹,在這中間已經(jīng)發(fā)生了由A到B的數(shù)據(jù)轉(zhuǎn)換宰衙,這個轉(zhuǎn)換主要是由數(shù)據(jù)寫入數(shù)據(jù)庫造成的。
在FMDB提供了一套解決這類問題的方案(ps可能不是最好的睹欲,但是至少可以解決這類小規(guī)模數(shù)據(jù)請求供炼,小規(guī)模數(shù)據(jù)庫的并發(fā)需求)
且看FMDB的文件,如下如所示:
似曾相識窘疮,F(xiàn)MDatabase Represents a single SQLite database袋哼,
FMResultSet Represents the results of executing a query on an FMDatabase
(意思就是執(zhí)行SQL語句后返回的結(jié)果集合)
FMDatabaseQueue If you want to perform queries and updates on multiple threads, you'll want to use this class(看到?jīng)]有,如果想要用FMDB制造多線程現(xiàn)象闸衫,就用這個QUEUE隊列)
FMDatabasePool A pool of FMDatabase
objects(意思就是一個緩沖池)
ok涛贯,我們來理一遍:
FMDatabasePool的頭文件有這么一句話:Before using FMDatabasePool
, please consider using FMDatabaseQueue
instead,意思是這兩者都能達(dá)到多線程目的蔚出,只是建議使用FMDatabaseQueue(可能是這個更好點:)弟翘,我們慢慢探究)。
FMDatabasePool線程可以在inDatabase去運行骄酗,這個api有個說明就是block The code to be run on the FMDatabasePool
pool稀余,使用方式如下:
FMDatabasePool *dbPool = [FMDatabasePool databasePoolWithPath:dbPath];
FMDBQuickCheck([dbPool countOfOpenDatabases] == 0);
__block FMDatabase *db1;
[dbPool inDatabase:^(FMDatabase *db) {
FMDBQuickCheck([dbPool countOfOpenDatabases] == 1);
FMDBQuickCheck([db tableExists:@"t4"]);
db1 = db;
}];