фонИспользование SERIALIZABLE изоляции транзакций с Alfresco
Alfresco использует изоляцию транзакции базы данных по умолчанию, который для нашей базы данных Oracle является READ_COMMITED. Я работаю над проектом, где неповторяющиеся и фантомные чтения могут быть серьезной проблемой, поэтому я изучаю использование изолированной транзакции SERIALIZABLE, чтобы избежать этого.
С одной стороны, у нас будет пользовательская служба API, которая группирует изменения в атомные транзакции - в основном операции CRUD в документах. С другой стороны, мы будем иметь фоновые процессы, обновляющие метаданные этих документов, которые выполняются параллельно.
Эти операции будут использовать запросы транзакционных метаданных, чтобы не усложнять ситуацию, добавляя в состав последовательно согласованные запросы SOLR.
Целью является возможность переноса основной модели метаданных во время работы службы API. Для целей этого вопроса я собираюсь использовать один атрибут в качестве примера, но в IRL будет много изменений такого рода. Например, в настоящее время у нас есть поле метаданных с ограничением: mymodel: doctypes1. Но нам нужно переназначить значения в mymodel: doctypes1 в новое поле с другим ограничением: mymodel: doctypes2. (Не спрашивайте меня, почему, я не могу контролировать это решение, и я лично сомневаюсь в мудрости такого рода изменений).
Мое понимание READ_COMMITTED изоляции говорит мне, что в этом случае, мы очень уязвимы к следующей ситуации:
- Фоновый процесс начинает транзакцию и считывает значение MyModel: doctypes1.
- API пишет изменение mymodel: doctypes1 перед тем, как выполняется фоновый процесс.
- Фоновый процесс обновляет значение mymodel: doctypes2 на основе исходного значения mymodel: doctypes1.
Эти два значения теперь несовместимы: я считаю, что эта ошибка называется неповторяющимся чтением.
Вопросы
ли установка базы данных Oracle для SERIALIZABLE предотвратить эту проблему? Alfresco использует весенние транзакции под капотом. Я понимаю, что сериализованная tx-изоляция с транзакциями Spring предотвратит «прозрачность» этой проблемы.
Есть ли у кого-нибудь реальный опыт в мире настройки базы данных Alfresco для SERIALIZABLE? Вы пытались решить подобную проблему? Это сработало? Какое влияние на производительность оказало это для вас?
Спасибо, что поделились своими впечатлениями!
Если вы используете Oracle с Alfresco, вы используете платный Alfresco One Enterprise. Это означает, что вы получаете поддержку - просто дайте им кольцо/поднимите билет, и они свяжут вас с одной из горстки инженеров Alfresco, которые действительно действительно знают этот материал! – Gagravarr