sqlite переход от транзакций к точкам сохранения - PullRequest
5 голосов
/ 12 марта 2012
Приложение

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

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

1 Ответ

7 голосов
/ 13 марта 2012
    It there a reason NOT to do it?

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

    Are there any pitfalls I need to be aware of?

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

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

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

...