Вопрос

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

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

Решение

    It there a reason NOT to do it?

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

    Are there any pitfalls I need to be aware of?

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top