5

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

在此处输入图像描述

我使用这里提到的单个 SQLite 连接(单例),但是这个问题仍然存在。所以我希望能得到一些帮助。在此先感谢!

PS如果我有竞争条件,我应该使用什么其他方式进行多线程插入?

4

1 回答 1

9

我认为您的问题是竞争条件。由于您有多个线程正在启​​动和结束事务,您可能会得到类似以下操作的内容:

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与写入线程共享的线程。

于 2013-04-18T17:44:16.613 回答