gpt4 book ai didi

android - SQLite同时读写

转载 作者:IT老高 更新时间:2023-10-28 22:16:05 27 4
gpt4 key购买 nike

我读了很多主题,但无法弄清楚问题的答案:是否可以同时读写?

我有更新一些数据的后台线程,并且 UI 需要存储在 DB 中的一小部分数据。所以在 UI 线程中执行 SELECT 操作。但是当更新正在进行时它会阻塞。结果,UI 卡住了几秒钟。

有没有人在写的时候从数据库中读取成功?


可以在 iPhone 上读取和写入 DB。造成这种差异的原因是在原生 sqlite 函数上同步实现包装器吗?

最佳答案

在 Android 3.0 和更高版本的 SQLiteDatabases 支持 WAL 模式(预写日志记录):

When write-ahead logging is not enabled (the default), it is not possible for reads and writes to occur on the database at the same time. Before modifying the database, the writer implicitly acquires an exclusive lock on the database which prevents readers from accessing the database until the write is completed.

In contrast, when write-ahead logging is enabled, write operations occur in a separate log file which allows reads to proceed concurrently. While a write is in progress, readers on other threads will perceive the state of the database as it was before the write began. When the write completes, readers on other threads will then perceive the new state of the database.

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#enableWriteAheadLogging()

要在 WAL 模式下启动事务,请使用 beginTransactionNonExclusive() 而不是 beginTransaction()。当 beginTransaction() 以 EXCLUSIVE 模式启动事务时, beginTransactionNonExclusive() 以 IMMEDIATE 模式启动一个事务

  • EXCLUSIVE 模式使用排他锁 (http://www.sqlite.org/lockingv3.html#excl_lock),这意味着除了 read_uncommitted 连接之外,没有其他数据库连接能够读取数据库,并且没有异常的其他连接将能够写入数据库,直到事务完成
  • IMMEDIATE 模式使用保留锁 (http://www.sqlite.org/lockingv3.html#reserved_lock),这意味着没有其他数据库连接能够写入数据库或执行 BEGIN IMMEDIATE 或 BEGIN EXCLUSIVE,但是其他进程可以继续从数据库读取。

简单来说:在 IMMEDIATE 模式下调用 beginTransactionNonExclusive() ,我们可以在另一个线程正在写入时读取(写入事务开始之前的状态,因为我们不会使用 read_uncommitted 连接 -> http://en.wikipedia.org/wiki/Isolation_%28database_systems%29#Dirty_reads )。

关于android - SQLite同时读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8104832/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com