【发布时间】: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