2013-05-15 13 views
13

Devo fornire la sincronizzazione durante l'inserimento, l'interrogazione, l'aggiornamento e l'eliminazione di elementi da un database. Per quanto ho capito, beginTransaction() e beginTransactionNonExclusive() sono i metodi che mi servono.beginTransaction(), endTransaction() e setTransactionSuccessful(). Cosa fanno esattamente?

Oltre SQLite documentation descrive EXCLUSIVE, IMMEDIATE e DEFERRED piuttosto bene.

Le transazioni possono essere posticipate, immediate o esclusive. Differito significa che nessun blocco viene acquisito sul database fino a quando il database non è il primo accessibile.

Se la transazione è immediata, i blocchi RISERVATI vengono acquisiti su tutti i database non appena viene eseguito il comando BEGIN, senza in attesa del database da utilizzare. Dopo un INIZIO IMMEDIATO, nessun'altra connessione al database sarà in grado di scrivere sul database o fare un BEGIN IMMEDIATE o BEGIN EXCLUSIVE. Altri processi possono continuare a leggere dal database, tuttavia.

Una transazione esclusiva causa l'acquisizione di blocchi ESCLUSIVI su tutti i database . Dopo un ESCLUSIVO INIZIALE, nessun'altra connessione al database eccetto per le connessioni read_uncommitted sarà in grado di leggere il database e nessun altra connessione senza eccezioni sarà in grado di scrivere database fino al completamento della transazione.

Sembra fornire protezione dagli inserimenti e dalle query indesiderate mentre alcuni thread funzionano con il database. Ma non sono sicuro che questo garantisca la sincronizzazione.

C'è il metodo insert del mio ContentProvider.

@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(); 
    } 
} 

non ho avuto alcun problema, senza beginTransaction(), endTransaction() e setTransactionSuccessful() prima. Devo davvero aggiungerli?

risposta

1

Sì, fa applicazione smooth.Because SQLite considerare un cursore come una transazione, quindi se usiamo iniziare la transazione() prima inseriamo grande quantità di dati, quindi utilizzare setTransactionSuccessful() second, then endTransaction() infine, SQLite considererà questo evento insert come una transazione, invece di centinaia di transazioni.

Problemi correlati