Мое решение состоит в том, чтобы иметь единую точку входа, как предложено scripni, и добавить к ней подход, подобный транзакции.
Я использую базу данных в качестве журнала опережающей записи для всей транзакции.
1) пометить записи базы данных как «shouldBeDeleted» = true.
2) попробуйте удалить капли.
3) если произошла ошибка, и BLOB-объекты не были удалены, у вас все еще есть записи, и вы знаете, что BLOB-объекты, на которые они указывают, должны быть удалены. и вы можете попытаться удалить их позже, что более важно, вы можете игнорировать записи в запросах на чтение, как если бы вы использовали подход мягкого удаления.
4) если BLOB-объекты удалены, теперь вы можете удалить записи.
5) если это не удается, записи по-прежнему помечаются как «shouldBeDeleted», что позволяет игнорировать их и очистить позже.
Для меня главным преимуществом является то, что мне не нужно создавать работника только для этой цели, а также то, что изменение происходит мгновенно, в отличие от зависимости от цикла синхронизации, выходящего из окна, когда записи не синхронизируются.
Вы можете реализовать ту же идею для вставки / обновления почти таким же образом.
* Немного поздно, но я считаю, что проблема все еще актуальна, и другие столкнулись с ней.