Следует ли считывать несколько транзакций Clojure в транзакции для согласованности?
Это теоретический вопрос, мотивированный моим желанием лучше понять параллелизм Clojure.
Допустим, я пишу boids. Предположим, что каждое boid представляет собой отдельную зеленую нить, изменяющую позиции в векторе или ссылки, представляющие сетку мира. Подумайте о колонии муравьев Хикки.
Теперь документация на Clojure.org гласит: "Все чтения Refs будут видеть непротиворечивый снимок" мира Ref "в качестве начальной точки транзакции (ее" точки чтения ")".
Означает ли это, что я могу получить непротиворечивый моментальный снимок своего моделирования, например, нарисовать его, прочитав мой вектор ссылок в транзакции (то есть в контексте досинхронизации?)
Спасибо!
1 ответ
Вам нужна транзакция, если вы хотите последовательный снимок.
Если вы читаете ссылки за пределами транзакции, то вы просто получите мгновенное значение в тот момент, когда вы прочитали каждую из них. У вас нет гарантии, что другая транзакция не изменит один или несколько ссылок между вашими чтениями, поэтому вы можете получить несовместимое представление.