【发布时间】:2013-05-19 14:49:04
【问题描述】:
我的代码:
SQLiteDatabase db = ...;
db.beginTransaction();
try{
db.update(...);
db.setTransactionSuccessful();
}finally{
db.endTransaction();
}
现在的问题是 endTransaction 偶尔抛出 SQLiteDatabaseLockedException,我不知道原因,也不知道如何重复同样的异常。
来自SQLiteDatabaseLockedException 我读到:
如果数据库引擎无法获取数据库锁则抛出 它需要完成它的工作。
我从beginTransaction读到:
以独占模式开始交易。
来自SQLite manual 我读到:
需要一个独占锁才能写入数据库文件。 文件上只允许有一个 EXCLUSIVE 锁,不允许有其他锁 任何种类都允许与独占锁共存。为了 最大化并发性,SQLite 致力于最小化 持有独占锁。
那么当我从 beginTransaction 持有排他锁时,如何在 endTransaction 中不获取 DB 锁? 发生这种情况的 Android 版本是 4.0.4(我有崩溃报告,但无法重复)。
需要说我在数据库上启用了SQLiteDatabase.enableWriteAheadLogging,也许这很重要?我的应用在多个线程中访问数据库。
无论如何,我想得到清楚的解释,并做一个简单的例子,可以重复条件重复问题,以便我可以真正解决。 谢谢。
【问题讨论】:
-
不应该是:SQLiteDatabase db = new SQLiteDatabase();
-
已更新为“...”以标记它已经初始化。
-
@PointerNull 你是如何解决这个问题的?
标签: android sqlite android-sqlite