Делать последовательности событий атомарными в кислотном состоянии
Я пытаюсь сгруппировать последовательности событий в одну атомарную транзакцию.
Рассмотрим Map
хранится в кислотном состоянии, и представьте, что вы хотите реализовать Data.Map.alter
, Функция, которая принимает значение Maybe и возвращает его, не может быть сохранена в журнале изменений, поэтому невозможно определить кислотное событие. Alter
, Однако, если я напишу функцию, которая вызывает query st Lookup ...
искать старое значение, а затем update st Insert ...
чтобы написать новый (или удалить старый), есть условие гонки, и я могу уничтожить информацию из обновлений, которые произошли между ними.
В https://github.com/acid-state/acid-state/pull/48 я использовал дополнительный MVar
сделать ручную блокировку, но должно быть лучшее решение.
Есть идеи?
1 ответ
Автор кислотного состояния здесь.
Решение состоит в том, чтобы не использовать функции более высокого порядка, такие как "alter". Преимущества кислотного состояния (гарантии ACID, удаленный запуск кода и т. Д.) Достигаются только за счет использования сериализуемых данных. Это ограничение вряд ли когда-либо будет снято.
Обычно это не большая проблема; Просто специализируйте свой код. Если это не поможет, возможно, вы захотите сохранить свое состояние в MVar.
Ура, Дэвид.