2010-11-30 25 views
4

データベースの処理が重くなり、データベースに約10,000のレコードが追加されます。これには非常に時間がかかるので、トランザクションを使用する方がよいでしょう。Androidでコミットされていないトランザクションを読み取る

db.startTransaction(); 
.... 
do write operations. 
.... 
db.setTransactionSuccessful(); 
db.endTransaction(); 

ここで、トランザクション内にいくつかの読み取り操作があり、endTransactionまで挿入がコミットされないため、これらのレコードはフェッチされません。トランザクションアイソレーションレベルと呼ばれるものについて聞いたことがあります。これにより、汚い(コミットされていない)レコードも読み取ることができます。どのようにこれを行うにはどのようなアイデア?

+0

トランザクションはネストできます。ここで何が問題なの? – Pentium10

+0

問題は、私が挿入するものがコミットするまで「読み込み可能」でないことです。読み取りは実際のデータベースからのみ行われ、ダーティー・インサートでは行われないためです。私は推測する.. – Codevalley

答えて

1

ため

ルックは、私は、デフォルトでは、あなたがコミットすることがまだあるレコードを読み取ることができるようになりますことを見出しました。 SQliteOpenHelperを使用している場合、これは失敗します。これは、SQliteOpenHelperが2つの処理(読み取り&書き込み)を提供し、コミットされていない書き込みは他のハンドルから読み取ることができないためです。 したがって、コミットされていないレコードを読み取る場合は、SQLiteDatabaseクラスを使用します。

2

あなたは、私はSQLiteののSQL文のプラグマを呼び出す助言するこの

// outer transaction 
db.startTransaction(); 
.... 

    //roll out a new transaction 
    db.startTransaction(); 
    .... 
    do write operations. 
    .... 
    db.setTransactionSuccessful();// <-- you do commint inside of this transaction 

    // you can read data from here on from the previous committed transaction 

.... 
db.setTransactionSuccessful(); 
db.endTransaction(); 
+0

私はこれを試してみましょう。また、内部トランザクションのendTransaction()が欠けていましたか? – Codevalley

+0

はい私はそれを意図的に結びつけました。外部トランザクションが終了すると、そのトランザクションで実行されたすべての作業とネストされたすべてのトランザクションがコミットまたはロールバックされます。トランザクションは、(setTransactionSuccessfulを呼び出すことによって)きれいにマークされずに終了すると、ロールバックされます。それ以外の場合はコミットされます.' http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#beginTransaction() – Pentium10

+0

しかし、ドキュメントには、「呼び出し間にもうデータベース操作をしないでください。 setTransactionSuccessfulとcalling endTransaction ... "http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#setTransactionSuccessful() – Codevalley

3

を試してみました:

database.execSQL("PRAGMA read_uncommitted = true;"); 

をこのステートメントでは、クエリの代わりにREAD_SERIALIZABLE(デフォルトのSQLiteのモード)のREAD_UNCOMMITTEDトランザクション分離レベルを使用することを言います。インスタンスhere

関連する問題