【问题标题】:Android SQLite mult thread issueAndroid SQLite 多线程问题
【发布时间】:2017-02-18 21:09:26
【问题描述】:

我会尽量说清楚,但如果需要有关代码的更多详细信息,我可以提供。

我们有一个应用程序 ABC,它通过aidl binders 提供访问do Db。客户端应用程序 XYZ 对 ABC 应用程序上的 DAO 实现执行 IPC 调用。像 select、insert、update 和 delete 这样的命令效果很好,但是当我们在事务下调用这些命令时,我们遇到了问题。

基本上第一次调用 SQLiteDatabase.beginTransaction() - 通过一个 binder 对象 - 在 SQLite 上设置一个新事务并且 SQLiteDatabase.inTransaction() 方法返回 true。然后当我们调用 anyDAO.insert(...) 检查 inTransaction() 返回 false。

我们发现第一个调用 (beginTransaction) 在线程 TID #1 的服务中执行,第二个调用 (insert) 在另一个线程 TID #2 中执行。更改代码(仅用于测试)以执行 beginTransaction 并在单个 IPC 调用中插入有效,但我们需要单独调用。

问题:SQLite 准备好在不同线程中处理事务和 SQL 命令了吗?

【问题讨论】:

  • 我已经给了你一个将每个 AIDL 调用重定向到指定线程的工作代码,那你为什么不使用它呢?
  • @pskink 我们正在处理我们的代码。但是因为时间在流逝,我们让另一个开发人员以不同的方法工作,最终我们得到了答案:您的代码使我们找到了一个可行的解决方案(我们将在另一个问题中发布结果)。我们还发现,在 SQLite 中,当您在线程中启动 Transacion 时,您必须在同一线程中执行其他命令,否则您将没有事务。

标签: android multithreading sqlite aidl


【解决方案1】:

来自SQL documentation

SQLite 支持无限数量的同时读取器,但它在任何时刻只允许一个写入器。对于许多情况,这不是问题。作家排队。每个应用程序都快速完成其数据库工作并继续前进,没有任何锁定持续超过几十毫秒。但是有些应用程序需要更多的并发性,这些应用程序可能需要寻求不同的解决方案。

原因是 SQLite 不支持“真正的”并发,就像其他关系 DBMS 一样,即使写入操作是在不同的数据上完成的。

因此,如果您的应用程序需要许多并发(更新)操作,您应该考虑使用其他工具。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多