无法执行操作,因为插入数据库时​​没有当前事务

时间:2013-04-18 17:40:03

标签: java android multithreading sqlite android-sqlite

在我的Android应用程序中,我必须将数据插入来自不同线程的几个SQLite表中(一个线程用于插入一个表,并且有5个表)。有很多数据,所以我使用beginTransaction() - > setTransactionSuccessful() - >每个线程中的endTransaction();和所有线程同时启动,但在第二个或有时是第三个线程中,我总是遇到这个异常:

enter image description here

我使用单个SQLite连接(单例)和mentioned here一样,但是这个问题仍然存在。所以我希望能得到一些帮助。谢谢你提前!

P.S如果我有竞争条件,我应该采用其他方式进行多线程插入?

1 个答案:

答案 0 :(得分:7)

我认为你的问题是竞争条件。由于您有多个线程开始和结束事务,您可能会得到类似以下操作:

beginTransaction()
// this may be a noop because a transaction is already open
beginTransaction()
setTransactionSuccessful()
setTransactionSuccessful()
endTransaction()
// this may throw because the previous end closes the transaction
endTransaction()

我认为Sqlite不支持在单个连接上打开多个事务,正如您所指出的那样,多个连接是不可能的。

如果事务的目标是加速数据,那么您将不得不更改架构而不是从多个线程写入。您可以使用某种实用程序类来执行synchronized的实际数据库更新,以便所有线程都调用它并决定何时打开或关闭事务。另一个想法是让一个线程执行数据库操作,所有其他线程写入与写入线程共享的BlockingQueue