SQLite数据库会被锁定时,一些暂停功能在Android中操作它?

zqdjd7g9  于 2023-05-15  发布在  Android
关注(0)|答案(1)|浏览(187)

我在Android Studio项目中使用SQLite和Room。
有一些挂起函数用于操作SQLite数据库,后台服务中有一些挂起函数用于修改记录。
SQLite数据库会被锁定吗?

gywdnpxw

gywdnpxw1#

SQLite数据库是否会可能被锁定?

通常情况下,Room将使用WAL(预写日志记录)而不是日志模式。即,默认情况下,API 16+将利用WAL,而在API 16下将利用日志模式。

  • 使用WAL时,更改将在单独的文件(数据库文件名后缀为-wal)中进行。有时更改将应用于实际的数据库文件(检查点)。回滚基本上是从-wal文件中删除数据。
  • 创建日志后,更改将应用于数据库文件并保留记录(日志)。回滚是撤消对数据库文件所做更改的过程。

在WAL模式下,读取器和写入器通常不会相互锁定。要引用SQLite documentation
WAL提供了更多的并发性,因为读取器不会阻止写入器,而写入器也不会阻止读取器。阅读和写可以同时进行。
当然,上面的写程序(LOCK)是隐式的写程序块。在后面的文档中解释如下:-
写入器只是将新内容附加到WAL文件的末尾。因为作者不做任何会干扰读者行为的事情,所以作者和读者可以同时运行。但是,由于只有一个WAL文件,因此一次只能有一个writer。
正如预期的那样,读取器不会隐式地阻止读取器。
因此,如果有多个异步挂起的函数正在更新数据库,则可能会遇到锁定的数据库。可能指Composing Suspending Functions
如果您使用的是日志模式,请参阅setJournalMode,那么并发性(锁定)的限制性更强请参阅File Locking and Concurrency

相关问题