Представьте счет с Ref, т.е. Ref для каждого аккаунта, и выполните операцию перевода денег в операции dosync. Также убедитесь, что вы не выполняете никаких операций с побочными эффектами (кроме этих ссылок) в операции dosync, поскольку она может быть повторена в случае конфликта при обновлении ссылок.
Обновление:
Если у вас будет фиксированное количество учетных записей, вы можете использовать ссылку на векторы, где каждая ссылка в векторе является учетной записью, а каждая учетная запись идентифицируется индексом в векторе.
Ex:
(def total-accounts 100)
(def accounts (vec (map (fn [_] (ref 100)) (range total-accounts))))
В случае, если вам нужно динамически добавлять новые учетные записи и идентифицировать их по имени, вы можете использовать хэш-карту, где ключ - это идентификатор учетной записи (уникальное значение), а значение - ссылка для баланса счета. Вам нужно будет обернуть эту карту в ссылку на случай, если вы хотите выполнить параллельные операции для добавления / удаления учетных записей из нескольких потоков.