sqlite переход от транзакций к точкам сохранения

Мой SQLiteв настоящее время приложение использует транзакции - как для возможности отката, так и для повышения производительности. Я рассматриваю возможность замены всех транзакций на точки сохранения. Причина в том, что приложение является многопоточным (да, sqlite настроен как потокобезопасный), и в некоторых случаях транзакция может быть запущена двумя потоками одновременно (в одном БД).

  1. Есть ли причина НЕ делать это?
  2. Есть ли какие-либо подводные камни, о которых мне нужно знать?
  3. Должен ли я просто заменить BEGIN, COMMIT, ROLLBACK с SAVEPOINT xyz, RELEASE SAVEPOINT xyz, ROLLBACK TO SAVEPOINT xyz?

1 ответ

Решение
    It there a reason NOT to do it?

Да. Это не решит ни одной из перечисленных вами проблем. Точки сохранения в основном используются для частичного отката данных. Внешняя транзакция или точка сохранения - это то, что на самом деле зафиксировано. Ничто не будет полностью сохранено до тех пор, пока эта крайняя точка сохранения не будет освобождена, что приведет к обновлению БД. Вы вернулись к той же проблеме, что и у вас со стандартными транзакциями.

    Are there any pitfalls I need to be aware of?

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

Короче говоря, если у вас нет необходимости делать частичный откат транзакции, точки сохранения действительно не дадут вам много (кроме факта, что они названы).

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

Другие вопросы по тегам