beginTransaction (), endTransaction () et setTransactionSuccessful (). Que font-ils exactement?

Je dois fournir la synchronisation lors de l'insertion, interroger, mettre à jour et supprimer des éléments à partir d'une base de données. Autant je comprends beginTransaction() et beginTransactionNonExclusive() sont les méthodes dont j'ai besoin.

Outre SQLite documentation décrit EXCLUSIVEIMMEDIATEet DEFERRED assez bien.

Les Transactions peuvent être différé, immédiat, ou exclusif. Différé signifie
qu'aucun verrou n'est acquis sur la base de données jusqu'à ce que la base de données
accessible.

Si la transaction est immédiate, alors RÉSERVÉE serrures sont acquis sur
toutes les bases de données dès le début de la commande est exécutée, sans
d'attente pour la base de données utilisée. Après un COMMENCER IMMÉDIATE, pas d'autres
connexion de base de données sera en mesure d'écrire dans la base de données ou faire un
COMMENCER IMMÉDIATE ou COMMENCER EXCLUSIF. D'autres processus peuvent continuer à
lire à partir de la base de données, cependant.

Exclusif de transaction provoque des verrous EXCLUSIFS à être acquis sur tous les
les bases de données. Après un COMMENCER EXCLUSIVE, aucune autre connexion de base de données
sauf pour read_uncommitted connexions seront en mesure de lire les
base de données et pas d'autre lien, sans exception, seront en mesure de
écrire la base de données jusqu'à ce que la transaction soit terminée.

Il semble offrir une certaine protection contre les insertions et les requêtes alors que certains thread est de travailler avec la base de données. Mais je ne suis pas sûr qu'il garantit la synchronisation.

Il est le insert méthode de mon 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();
    }
}

Je n'ai pas eu de problèmes sans beginTransaction()endTransaction()et setTransactionSuccessful() avant. Ai-je vraiment besoin de les ajouter?

source d'informationauteur Maksim Dmitriev