У тебя главная проблема возникает в момент одновременной работы с базой данных несколькими пользователями
Именно эту проблему нужно решать, и в общем случае это непростая задача, если нет сервера.
Держать копию базы данных на самом клиенте проблем не составит, инструменты есть как штатные у баз данных (репликация) так и средствами самого приложения
В качестве решения могу предложить следующее - установи в локальной сети полнофункциональную копию сервера (не только базу данных но и бакэнд), все клиенты из локальной сети работают либо с главным сервером либо с локальным, в этой схеме в момент появления связи, конфликтов в пределах пользователей локальной сети не будет (но возможны конфликты между удаленными пользователями и локальными)
p.s. один из вариантов решения проблемы - допустить конфликты в самой программе, т.е. вот у тебя форма редактирования объекта, если после предыдущего сеанса синхронизации базы появились конфликты, то интерфейс должен показывать это, давать возможность работать со всеми конфликтами и возможность их разруливать (объединение данных если было редактирование с выбором какие поля оставить а какие нет, сложнее со ссылкой на удаляемый объект, в таких случаях нужна возможность либо отменить удаление либо удалить связь с ним)
Вообще понятие 'конфликтное или неточное состояние' - нормальное, в разных системах это представляется по разному, например понятие 'черновик', или статус - принято/на рассмотрении, когда есть специальные люди, приводящие базу в консистентное состояние, и этот процесс непрерывный. Полноценная поддержка всех возможных конфликтов - мечта, так или иначе это реализуют поверх и удерживают способы в голове самих пользователей, ну к примеру в базе нет возможности указать что запись дубликат, на время пока этот дуп разруливается а его связи корректируются и переносятся на один объект, будущий удаляемый помечается как удаляемый через пометку в наименовании... т.е. база статуса на это не имеет но операторы друг с другом договариваются что такие объекты не использовать