附加的 sqlite 数据库和 Android 中的多线程问题



我想了解对 ATTACHED sqlite 数据库进行多线程访问所涉及的问题。显而易见的是,一个SQLiteOpenHelper确保一个数据库连接,从而确保对数据库的一个序列化访问。当一个"子"数据库在两个不同的"父"SQLiteOpenHelper/两个不同的父数据库连接下附加两次时会发生什么?

Q1:如何序列化对附加子数据库的访问?

问题 2:在此方案中如何实现预写日志记录?

需要明确的是,这就是我所描述的场景:

ASQLiteOpenHelper instanceA = new ASQLiteOpenHelper( context, dbnameA, null, version);
BSQLiteOpenHelper instanceB = new BSQLiteOpenHelper( context, dbnameB, null, version);
instanceA.getWritableDatabase().execSQL( "ATTACH '" + dbnameChild + "' AS child" );
instanceB.getWritableDatabase().execSQL( "ATTACH '" + dbnameChild + "' AS child" );

通过instanceAinstanceB同时给"孩子"写信安全吗?读书呢?如果为父级启用预写日志记录,是否也为子项启用?如果是,是否为child创建了两个单独的预写日志记录日志?

从这里:

我们知道没有其他嵌入式 SQL 数据库引擎支持 与SQLite一样的并发性很高。SQLite允许多个进程具有 数据库文件立即打开,供多个进程读取 数据库一次。当任何进程想要写入时,它必须锁定 更新期间的整个数据库文件。但这通常 只需几毫秒。其他进程只是等待编写器 完成然后继续他们的业务。其他嵌入式 SQL 数据库引擎通常只允许单个进程连接到 一次数据库。

这里有大量关于并发性的信息。

经过一些测试,我发现 ATTACH ed 数据库将在第一次ATTACH尝试时被锁定。进一步的ATTACH尝试将失败。

最新更新