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?