2016-10-10 88 views
0

我会尽量清楚,但如果需要更多关于代码的细节,我可以提供。Android SQLite mult线程问题

我们有一个应用程序ABC提供访问通过aidl活页夹做Db。客户端应用程序XYZ在ABC应用程序上执行对DAO实现的IPC调用。像select,insert,update和delete这样的命令工作得很好,但是当我们在事务中调用这些命令时,我们遇到了问题。

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

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

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

+0

我已经给你一个将每个AIDL调用重定向到指定线程的工作代码,那么为什么你不使用它? – pskink

+0

@pskink我们正在使用我们的代码。但是因为时间在流逝,我们设置了另一位开发人员以不同的方式工作,并且在一天结束时我们得到了答案:您的代码将我们推向了一个可行的解决方案(我们将在另一个问题中发布结果)。我们还发现,在SQLite中,当您在线程中启动Transacion时,必须在同一线程中执行其他命令,否则您没有事务。 –

回答

0

SQL documentation

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

原因是SQLite不像其他关系DBMS那样支持“实际”并发性,即使写操作是在不同的数据上完成的。因此,如果您的应用程序需要许多并发(更新)操作,您应该考虑使用其他工具。