Как работают транзакции SQLite на Android? - PullRequest
0 голосов
/ 18 ноября 2018

Мое понимание транзакций SQLite на Android в основном основано на этой статье . В сущности он предполагает, что

если вы не заключите вызовы SQLite в явную транзакцию, это создать неявную транзакцию для вас. Следствием этих неявные транзакции - это потеря скорости

.

Это наблюдение верно - я начал использовать транзакции, чтобы исправить только эту проблему: скорость. В своем собственном приложении для Android я использую несколько довольно сложных таблиц SQLite для хранения данных JSON, которыми я манипулирую через расширение SQLite JSON1 - я использую SQLCipher со встроенным JSON1.

В любой момент времени мне приходится манипулировать - вставлять, обновлять или удалять - строки в нескольких таблицах. Учитывая сложность JSON, я делаю это с помощью временных таблиц, которые я создаю для каждой манипуляции с таблицами. Начало манипуляции начинается с SQL в соответствии с

DROP TABLE IF EXISTS h1;
CREATE TEMP TABLE h1(v1 TEXT,v2 TEXT,v3 TEXT,v4 TEXT,v5 TEXT);

Для некоторых таблиц требуется только одна таблица, которую я обычно называю h1, а для других - две; в этом случае я называю их h1 и h2.

Вся последовательность операций в любом отдельном наборе манипуляций принимает вид

begin transaction
    manipulate Table 1 which
        which creates its own temp tables, h1[h2], 
        then extracts relevant existing JSON from Table 1 into the temps
        manipulates h1[h2]
        performs inserts, updates, deletes in Table 1
    on to the next table, Table 2 where the same sequence is repeated
    continue with a variable list of such tables - never more than 5
end transaction

Мои вопросы

  • Похоже ли это на эффективный способ выполнения задач или было бы лучше обернуть каждую отдельную табличную операцию в свою собственную транзакцию?
  • мне не ясно, что происходит с моими DROP TABLE/CREATE TEMP TABLE звонками. Если я получу временные таблицы h1 [h2], которые предварительно заполнены данными из таблицы (n - 1) при работе с таблицей (n), то обновления таблицы (n) будут полностью неверными. Я предполагаю, что бит DROP TABLE, который у меня есть, решает эту проблему. Я прав, предполагая это?

Я должен признать, что не был экспертом по SQL, тем более по SQLite, и совсем новичком в использовании транзакций. Расширение SQLite JSON является очень мощным, но вводит совершенно новый уровень сложности при работе с данными.

1 Ответ

0 голосов
/ 19 ноября 2018

Основной причиной использования транзакций является сокращение накладных расходов на запись на диск.

Таким образом, если вы не включите в транзакцию несколько изменений (вставок, удалений и обновлений), то каждое из них приведет к записи базы данных на диск и сопутствующим накладным расходам.

Если вы заключите их в транзакцию, а версия в памяти будет записана только после завершения транзакции (обратите внимание, что при использовании SQLiteDatabase beginTransaction / endTransaction Методы , которые вы должны в рамках завершения транзакции использовать метод setTransactionSuccessful , а затем использовать метод endTransaction ).

То есть метод SQLiteDatabase отличается от выполнения этого с помощью чистого SQL, когда вы начинаете транзакцию, а затем завершаете / фиксируете ее / их (т.е. методы SQLiteDatabase в противном случае автоматически откатывали бы транзакции).

Сказав это утверждение: -

если вы не заключите вызовы SQLite в явную транзакцию, это создать неявную транзакцию для вас. Следствием этих неявные транзакции - это потеря скорости

в основном повторяет: -

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

SQL как понял SQLite - НАЧАЛО СДЕЛКИ То есть он не специфичен для Android.

это звучит как эффективный способ сделать что-то или это будет лучше обернуть каждую отдельную табличную операцию в свою собственную транзакцию?

Выполнение всех операций в одной транзакции будет более эффективным, поскольку выполняется только одна операция записи на диск.

мне не ясно, что происходит с моим ТАБЛИЦЕЙ DROP TABLE / CREATE TEMP звонки. Если я в конечном итоге с временными таблицами h1 [h2], которые предварительно заполнены данные из таблицы (n - 1) при работе с таблицей (n) затем обновления в Таблице (n) пойдут совсем не так. Я предполагаю, что DROP TABLE немного, я имею дело с этой проблемой. Я прав в предполагая это?

Удаление таблиц обеспечит целостность данных (т. Е. Вы должны, по звуку этого, сделать это), вы также можете использовать: -

CREATE TEMP TABLE IF NOT EXISTS h1(v1 TEXT,v2 TEXT,v3 TEXT,v4 TEXT,v5 TEXT);
DELETE FROM h1;
...