2015-04-18 4 views
4

Вот простой пример:Должен ли я всегда использовать транзакции в sqlite для Android?

public boolean containsId(Long userid) { 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery("select * from " + getTableName() + " where id = " + userid, null); 
    boolean rows = cursor.getCount() > 0; 
    db.close(); 
    return rows; 
} 

Я думал, SQLite автоматически начинает транзакцию. Мой коллега сказал, что я должен всегда начинать транзакцию.

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

ответ

3

В базу данных не допускаются изменения, за исключением транзакции. Любая команда, которая изменяет базу данных (в основном, любая команда SQL , кроме SELECT), автоматически запустит транзакцию, если она равна , которая уже не действует. Автоматически запущенные транзакции: , совершенные при завершении последнего запроса.

Сделки можно запустить вручную, используя команду BEGIN. Такие транзакции обычно сохраняются до следующей команды COMMIT или ROLLBACK . Но транзакция будет также ROLLBACK, если база данных закрыта или если возникла ошибка, и задан алгоритм разрешения ROLLBACK-ответа .

SQLite Query Language.

Да, транзакция начинается автоматически. Однако, если вы выполняете несколько запросов без начала транзакции вручную, запускаются и завершаются несколько транзакций, что отрицательно сказывается на производительности.
Кроме того, автоматический механизм отката откатывает только один запрос при его сбое.