2012-02-12 21 views
1

を一度に多数のトランザクションを作成できるようにしますか?this documentを読むと、SQLiteはトランザクションとネストされたトランザクションをサポートしています。私は多くの異なるトランザクションを作成することが可能であるのだろうかと思います。AndroidのSQLite

例:データベース接続に2つのスレッドアクセス権があります。各スレッドでトランザクションを作成する可能性があり、ネストされていませんか?

答えて

2

Sqlite does not support nested transactions

トランザクションは、BEGIN ...ない巣を行うCOMMITを使用して作成しました。ネストされた トランザクションの場合は、SAVEPOINTおよびRELEASEコマンドを使用します。

SQLiteDatabaseクラスでネストされたトランザクションを使用すると、自分自身でデッドロックが発生することがあります。ネストされたトランザクションから離れることを強くお勧めします。自分のロックを使用して、トランザクションが入れ子にならないようにします。

1

2つの別々のスレッドで2つの別々のトランザクションを作成することは、「ネストトランザクション」とはみなされません。

各スレッドは、0または1のDB接続にマップされた独自のdbセッションを維持します(DB接続は接続プールから選択することができ、セッションによって接続が不要になった場合に返されます。セッションは接続が必要かどうかによって異なります)。

したがって、各スレッドは、他のスレッドとは独立した独自の状態を維持します。

../Android/sdk/sources/android-23/android/database/sqlite/SQLiteDatabase.java:

// Thread-local for database sessions that belong to this database. 
// Each thread has its own database session. 
// INVARIANT: Immutable. 
private final ThreadLocal<SQLiteSession> mThreadSession = new ThreadLocal<SQLiteSession>() { 
    @Override 
    protected SQLiteSession initialValue() { 
     return createSession(); 
    } 
}; 

../Android/sdk/sources/android-ソースは、この確認します23 /アンドロイド/データベース/ SQLiteの/ SQLiteSession.java:

* <h2>About database sessions</h2> 
* <p> 
* Database access is always performed using a session. The session 
* manages the lifecycle of transactions and database connections. 
* </p><p> 

...

* Consequently, each thread 
* has its own session object and therefore its own transaction state independent 
* of other threads. 

だから行くの二つのトランザクションを持っている場合別のスレッドでは、それらは「ネスト」ではなく完全に独立しており、関連するトランザクションのモードとタイプに応じて並列に実行されるか、またはシリアル化されます(つまり、直ちに、排他的であるかどうか、またそれらが読み書きされているかどうか)。

ただし、これを実現するには、AndroidのSQLiteライブラリを適切に使用する必要があります。

私が持っている2つのスレッドは、(私はあなたがそのでも、可能であればこれを実現できるかどうかはわかりませんが)、データベース接続、これは両方のスレッドは、同じSQLiteSessionを使用していることを意味場合

へのアクセスそれはデッドロックを招く恐れがあります。

マイセットアップ:

  1. シングルコンテンツプロバイダ
  2. コンテンツプロバイダはそののonCreate()
  3. コールmHelperにSQLiteOpenHelperのメンバー変数mDbHelperを初期化します。
  4. コンテンツプロバイダのクエリ/挿入/ ...メソッドで、必要に応じて実行時間の長いトランザクションがあることを行っている場合getReadableDatabase/getWriteableDatabaseのAndroidは、コンテンツプロバイダ

を使用する各スレッドに別のトランザクション状態を確保処理します(例えば、バックグラウンドスレッドのsyncからのデータのインポート)を実行するには、db.yieldIfContended()またはdb.yieldIfContendedSafely()を使用して、他のスレッドからのトランザクション(UIスレッドの更新を記録または記録する)を絞って、これらのスレッドをブロックして終了します。