Чтение незафиксированных транзакций в Android - PullRequest
4 голосов
/ 30 ноября 2010

У меня происходят тяжелые операции с базой данных, что добавляет около 10000 записей в мою базу данных. Поскольку это может занять очень много времени, было бы лучше использовать транзакции.

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

Теперь у меня есть некоторые операции чтения внутри транзакций, и поскольку вставки не фиксируются до endTransaction, эти записи не выбираются. Я слышал о так называемых уровнях изоляции транзакций, которые также позволяют нам читать грязные (незафиксированные) записи. Есть идеи как это сделать?

Ответы [ 3 ]

3 голосов
/ 21 декабря 2010

Я бы посоветовал вызвать SQLite SQL-выражение pragma:

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

Этот оператор говорит, что запросы будут использовать уровень изоляции транзакции READ_UNCOMMITTED вместо READ_SERIALIZABLE (режим SQLite по умолчанию).

Смотрите, например, здесь

2 голосов
/ 30 ноября 2010

Вы пробовали это

// 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();
1 голос
/ 22 декабря 2010

Я обнаружил, что по умолчанию вы сможете читать записи, которые еще предстоит зафиксировать. Хотя это не работает, если вы используете SQliteOpenHelper. Это связано с тем, что SQliteOpenHelper дает 2 отдельных обработанных (чтение и запись), а незафиксированные записи не будут доступны для чтения с другого дескриптора. Итак, если вы хотите прочитать незафиксированные записи, используйте SQLiteDatabase class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...