2013-05-15 5 views
13

データベースから項目を挿入、照会、更新、削除するときに同期を提供する必要があります。私が理解する限り、beginTransaction()beginTransactionNonExclusive()が私が必要とする方法です。beginTransaction()、endTransaction()、およびsetTransactionSuccessful()です。彼らは正確に何をしていますか?

さらに、SQLite documentationは、EXCLUSIVE,IMMEDIATEおよびDEFERREDを非常によく表している。

トランザクションは、遅延、即時、または排他にすることができます。遅延された手段 は、データベースが最初にアクセスされるまでデータベースでロックが取得されないことを意味します。

トランザクションが即時の場合、 データベースの使用を待たずに、BEGINコマンドが実行されるとすぐに、すべてのデータベースで の予約ロックが取得されます。 BEGIN IMMEDIATE後、他の データベース接続はデータベースに書き込むことができず、 BEGIN IMMEDIATEまたはBEGIN EXCLUSIVEを実行することはできません。しかし、他のプロセスは、 をデータベースから読み取ることができる。

排他的なトランザクションによって、すべての データベースで排他ロックが取得されます。 BEGIN EXCLUSIVEの後、read_uncommitted接続を除く他のデータベース接続 は、 データベースを読み取ることはできず、他の接続は例外なく、トランザクションが完了するまで データベースに書き込むことはできません。

一部のスレッドがデータベースで作業している間に、不要な挿入やクエリから保​​護されているようです。しかし、同期が保証されているかどうかはわかりません。

私のContentProviderinsertメソッドがあります。

@Override 
public Uri insert(Uri baseUri, ContentValues values) { 
    try { 
     mDatabase = mHelper.getWritableDatabase(); 
     mDatabase.beginTransaction(); // EXCLUSIVE 
     switch (sUriMatcher.match(baseUri)) { 
     case UriCodes.COUNTRIES: 
     case UriCodes.CONTINENTS: 
     case UriCodes.ORGS: 
      String table = baseUri.getLastPathSegment(); 
      long rowId = mDatabase.insert(table, null, values); 
      Uri uri = Uri.withAppendedPath(baseUri, Long.toString(rowId)); 
      mDatabase.setTransactionSuccessful(); 
      return uri; 

     default: 
      mDatabase.endTransaction(); 
      throw new IllegalArgumentException(UNSUPPORTED_URI + SPACE + baseUri); 
     } 
    } finally { 
     mDatabase.endTransaction(); 
    } 
} 

は私が前にbeginTransaction()endTransaction()、およびsetTransactionSuccessful()なしで何の問題もありませんでした。私は本当にそれらを追加する必要がありますか?

答えて

1

我々はデータの大きな量を挿入する前に、はい、それは)我々は(トランザクションを開始使っので、もしアプリsmooth.Because SQLiteのは、1つのトランザクションとして1カーソルを考慮せ、最後にsetTransactionSuccessful()を使い、最後にendTransaction()を使うと、SQLiteはこの挿入イベントを何百ものトランザクションではなく1つのトランザクションとみなします。

関連する問題