对sqlite的多线程访问数据安全等问题一直困惑不解,数据库是存放数据的地方,业务数据和基础数据有可能都会存放在同一个数据库中,数据库的多线程访问带来的数据安全问题主要体现在数据的错乱。
所谓数据的错乱,指的就是读写顺序错误,造成本来应该读取A数据,结果读取的是B数据,在这中间已经发生了由A到B的数据转换,这个转换主要是由数据写入数据库造成的。
在FMDB提供了一套解决这类问题的方案(ps可能不是最好的,但是至少可以解决这类小规模数据请求,小规模数据库的并发需求)
且看FMDB的文件,如下如所示:
似曾相识,FMDatabase Represents a single SQLite database,
FMResultSet Represents the results of executing a query on an FMDatabase
(意思就是执行SQL语句后返回的结果集合)
FMDatabaseQueue If you want to perform queries and updates on multiple threads, you'll want to use this class(看到没有,如果想要用FMDB制造多线程现象,就用这个QUEUE队列)
FMDatabasePool A pool of FMDatabase
objects(意思就是一个缓冲池)
ok,我们来理一遍:
FMDatabasePool的头文件有这么一句话:Before using FMDatabasePool
, please consider using FMDatabaseQueue
instead,意思是这两者都能达到多线程目的,只是建议使用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;
}];