sqlite переход от транзакций к точкам сохранения
Мой SQLite
в настоящее время приложение использует транзакции - как для возможности отката, так и для повышения производительности. Я рассматриваю возможность замены всех транзакций на точки сохранения. Причина в том, что приложение является многопоточным (да, sqlite
настроен как потокобезопасный), и в некоторых случаях транзакция может быть запущена двумя потоками одновременно (в одном БД).
- Есть ли причина НЕ делать это?
- Есть ли какие-либо подводные камни, о которых мне нужно знать?
- Должен ли я просто заменить
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?
Да. Транзакции или точки сохранения в многопоточном приложении могут довольно легко зайти в тупик, если вы обновляете одни и те же данные в двух разных потоках, которые, как я полагаю, составляют суть проблемы. Там нет никакой разницы между двумя в этом отношении. Вы должны быть осведомлены о том, что вы обновляете в каждом потоке, и выполнять соответствующую синхронизацию.
Короче говоря, если у вас нет необходимости делать частичный откат транзакции, точки сохранения действительно не дадут вам много (кроме факта, что они названы).
Здесь нет серебряной пули. Похоже, вам нужно серьезно проанализировать ваше приложение и данные, которые могут быть обновлены в несколько потоков, и добавить некоторую синхронизацию в ваше приложение, если это необходимо.