2012-05-10 14 views
1

私のアプリでは、非同期タスクでいくつかのWebサービスを調整し、大きな応答を持つデータベース内の異なるテーブルに大きなデータを挿入する必要があります。エンド・トランザクション。問題はすべて私が新しいレコードを挿入しようとするとすべてのWebサービスの後にログが表示されます。失敗5(データベースがロックされています)。データベースがinTransaction()、isDbLockedByOtherThreads、およびisDbLockedByCurrentThreadによってロックされているかどうかを確認しました。すべてfalseを返す。Androidの障害5(データベースがロックされている)問題

これを解決する方法。

答えて

1

Sqliteでは同時書き込みが許可されていません。書き込みが進行中の場合、デフォルトでは別のトランザクションの開始が失敗します。 C APIには、短い時間で繰り返し再試行する機能があります(set_busy_timeout)、Android Javaラッパーには似たようなAPIはありませんので、再試行する必要がありますこのエラーはあなた自身。

すべての考えられるエラー条件の下で、すべてのトランザクションをコミットまたはロールバックする(明示的なトランザクションはすべてのステートメントを終了しないでください)。

isDbLockedByOtherThreadsはおそらくを返しています。他のトランザクションが呼び出される前に完了しているか、実際にはわからないという理由だけで終了する可能性があります。これはCでこのチェックを行う機能レベル。

テーブルを変更し、そのテーブルを参照して未完成のステートメントを参照してもステータス6(テーブルがロックされている)の場合も同様のエラーが発生します。

+0

私は同時に2つの異なるスレッドでデータの書き込みと読み取りを行っていますが、これがデータベースロックの理由だと思いますか?特に私は異なるテーブルからデータを収集するためにジョイントを使用しています。 – Kishore

+0

@Kishore:はい、間違いなくデータベースロックの理由です。データベースが[WAL](http://www.sqlite.org/wal.html)モードになっていない限り、**書き込みが進行中**は読み取りが許可されません**(トランザクション内を除く)。私はAndroidのビルドがWALモードをサポートしているとは思わない。 [有効にする](http://www.sqlite.org/pragma.html#pragma_journal_mode)と試してみてください。これにより、書込みトランザクションが進行中(チェックポイント操作中を除く)に読取りが可能になりますが、一度に1つのライターしか許可されません。 –

関連する問題