Делать последовательности событий атомарными в кислотном состоянии

Я пытаюсь сгруппировать последовательности событий в одну атомарную транзакцию.

Рассмотрим 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.

Ура, Дэвид.

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