2010-11-30 9 views
4

J'ai des opérations lourdes de base de données en cours, ce qui ajoute environ 10 000 enregistrements à ma base de données. Comme cela pourrait prendre beaucoup de temps, il vaudrait mieux utiliser les transactions.Lecture de transactions non validées dans Android

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

Maintenant, j'ai quelques opérations de lecture à l'intérieur des transactions, et étant donné que les inserts ne sont pas engagés jusqu'à ce que endTransaction, ces documents ne sont pas récupérés. J'ai entendu parler de quelque chose appelé Niveaux d'isolement des transactions, ce qui nous permet de lire des enregistrements sales (non validés). Une idée de comment faire cela?

+0

Les transactions peuvent être imbriquées. Quel est le problème ici? – Pentium10

+0

Le problème est que tout ce que j'insère n'est pas 'lisible' jusqu'à ce que je le commette. Parce que la lecture se produit uniquement à partir de la base de données réelle, mais pas les insertions sales. Je suppose .. – Codevalley

Répondre

1

Je trouve que par défaut, vous serez en mesure de lire les enregistrements qui ne sont pas encore engagés. Bien que cela échoue si vous utilisez SQliteOpenHelper. C'est parce que SQliteOpenHelper donne 2 séparés manipulés (lire & écrire) et les écritures non validées ne seront pas disponibles pour la lecture de l'autre poignée. Donc, si vous voulez lire des enregistrements non-validés, utilisez la classe SQLiteDatabase.

2

Avez-vous essayé cette

// 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

Je vais essayer. Aussi, avez-vous manqué un endTransaction() pour la transaction interne? – Codevalley

+0

Oui, je l'ai laissé intentionnellement 'Lorsque la transaction externe est terminée tout le travail effectué dans cette transaction et toutes les transactions imbriquées seront validées ou annulées. Les modifications seront annulées si une transaction est terminée sans être marquée comme propre (en appelant setTransactionSuccessful). Sinon, ils seront validés. »Http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#beginTransaction() – Pentium10

+0

Mais, la documentation dit aussi:« Ne faites plus de travail de base de données entre les appels. setTransactionSuccessful et l'appel endTransaction ... "http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#setTransactionSuccessful() – Codevalley

3

Je conseillerais appeler instruction SQL de pragma SQLite:

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

Cette déclaration indique que les requêtes utiliseront le niveau d'isolation des transactions READ_UNCOMMITTED au lieu de READ_SERIALIZABLE (par défaut le mode de SQLite) .

Rechercher par exemple here

Questions connexes