Блокировка базы данных области?

При синхронизации я перезаписываю все свои локальные данные данными сервера. Для этого я сначала позвоню realm.delete(realm.objects(MyObj)) для всех моих объектов. Затем я сохраняю объекты ответа с realm.add(obj, update: false), Все в одной транзакции. Полезная нагрузка может занять некоторое время для обработки, но она недостаточно велика, чтобы оправдать внедрение нумерации страниц.

Может ли пользователь нормально использовать приложение во время этого процесса? Могут ли они хранить новые элементы, которые были удалены в клиринговой части транзакции, или которые могут вызвать ошибку или быть перезаписаны во время добавления части? Если да, как я могу избежать этого?

1 ответ

Realm использует алгоритм Multi-Version-Concurrency-Control. При этом используются блокировки для обеспечения исключительной записи, в то время как другие потоки могут продолжать читать предыдущие версии данных. У нас есть статья в нашем блоге, которая объясняет, как это работает более подробно.

Помните, что то, что вы пытаетесь решить здесь, является нетривиальной задачей.

Могут ли они хранить новые элементы, которые были удалены в клиринговой части транзакции, или которые могут вызвать ошибку или быть перезаписаны во время добавления части?

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

Объекты, которые будут удалены в начале, станут недоступными (что вы можете проверить через invalidated), потому что транзакции записи всегда работают с последней версией. Если ваши объекты имеют согласованные первичные ключи для всех ваших операций синхронизации, вы можете использовать их для повторного извлечения их и повторного выполнения всех модификаций в свежих экземплярах. Но обратите внимание, что вам нужно сохранить первичные ключи (и все другие данные объекта) в памяти перед началом транзакции записи, что подразумевает неявное обновление.

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