1

私のアプリでは、非同期タスクでいくつかのWebサービスを呼び出し、各応答でデータベース内の異なるテーブルに大きなデータを挿入する必要があります.各テーブルの高速挿入はトランザクションの開始と終了によってデータベースをロックしています. 問題は、新しいレコードを挿入しようとすると、すべての Web サービスの後、ログにFailure 5(database is locked) が表示されることです。データベースが inTransaction()、isDbLockedByOtherThreads、および isDbLockedByCurrentThread によってロックされているかどうかを確認しました。すべて false を返しました。

これを解決する方法。

4

1 に答える 1

1

Sqliteは同時書き込みを許可していません。デフォルトでは、書き込みが進行中の場合、別のトランザクションを開始しようとすると、このエラーで失敗します。C APIには、代わりに()を指定した時間だけ短いスリープで繰り返し再試行する機能がありset_busy_timeoutますが、Android Javaラッパーに同様のAPIが表示されないため、おそらくこれで再試行を処理する必要があります自分でエラーを起こします。

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

おそらく、他のトランザクションが呼び出す前に終了するか、呼び出した後に開始するか、または単にCレベルでこのチェックを行う関数を認識していないため、実際にはわからないために、が返されますisDbLockedByOtherThreadsfalse

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

于 2012-05-10T07:00:39.500 に答える