我在Android Studio项目中使用SQLite和Room。有一些挂起函数用于操作SQLite数据库,后台服务中有一些挂起函数用于修改记录。SQLite数据库会被锁定吗?
gywdnpxw1#
SQLite数据库是否会可能被锁定?
是。
通常情况下,Room将使用WAL(预写日志记录)而不是日志模式。即,默认情况下,API 16+将利用WAL,而在API 16下将利用日志模式。
在WAL模式下,读取器和写入器通常不会相互锁定。要引用SQLite documentationWAL提供了更多的并发性,因为读取器不会阻止写入器,而写入器也不会阻止读取器。阅读和写可以同时进行。当然,上面的写程序(LOCK)是隐式的写程序块。在后面的文档中解释如下:-写入器只是将新内容附加到WAL文件的末尾。因为作者不做任何会干扰读者行为的事情,所以作者和读者可以同时运行。但是,由于只有一个WAL文件,因此一次只能有一个writer。正如预期的那样,读取器不会隐式地阻止读取器。因此,如果有多个异步挂起的函数正在更新数据库,则可能会遇到锁定的数据库。可能指Composing Suspending Functions如果您使用的是日志模式,请参阅setJournalMode,那么并发性(锁定)的限制性更强请参阅File Locking and Concurrency
1条答案
按热度按时间gywdnpxw1#
SQLite数据库是否会可能被锁定?
是。
通常情况下,Room将使用WAL(预写日志记录)而不是日志模式。即,默认情况下,API 16+将利用WAL,而在API 16下将利用日志模式。
在WAL模式下,读取器和写入器通常不会相互锁定。要引用SQLite documentation
WAL提供了更多的并发性,因为读取器不会阻止写入器,而写入器也不会阻止读取器。阅读和写可以同时进行。
当然,上面的写程序(LOCK)是隐式的写程序块。在后面的文档中解释如下:-
写入器只是将新内容附加到WAL文件的末尾。因为作者不做任何会干扰读者行为的事情,所以作者和读者可以同时运行。但是,由于只有一个WAL文件,因此一次只能有一个writer。
正如预期的那样,读取器不会隐式地阻止读取器。
因此,如果有多个异步挂起的函数正在更新数据库,则可能会遇到锁定的数据库。可能指Composing Suspending Functions
如果您使用的是日志模式,请参阅setJournalMode,那么并发性(锁定)的限制性更强请参阅File Locking and Concurrency