У меня есть два Datomic-клиента , открытых в двух REPL, подключенных к одной и той же базе данных в Datomic Cloud. После обработки данных в REPL 1 соединение в REPL 2 не знает, что время увеличилось до выполнения запроса.
REPL 1
Я передаю некоторые данные, получая {:db-after {:t 768}}
(d/transact conn {:tx-data [{:person/first-name "Alice"}]})
=>
{:db-before {:database-id "<some-squuid>",
:db-name "datomic-test",
:t 767,
:next-t 768,
:history false,
:type :datomic.client/db},
:db-after {:database-id "<some-squuid>",
:db-name "datomic-test",
:t 768,
:next-t 769,
:history false,
:type :datomic.client/db},
:tx-data [#datom[13194139534080 50 #inst"2018-05-15T09:18:22.565-00:00" 13194139534080 true]
#datom[43976067064531301 73 "Alice" 13194139534080 true]],
:tempids {}}
(d/db conn)
=>
{:t 768,
:next-t 769,
:db-name "datomic-test",
:database-id "<some-squuid>",
:type :datomic.client/db}
REPL 2
Я получил последнее известное значение базы данных, но оно все еще находится на {:t 767}
(d/db conn)
=>
{:t 767,
:next-t 768,
:db-name "datomic-test",
:database-id "<some-squuid>",
:type :datomic.client/db}
Повторный вызов d / db всегда возвращает базу данных на :t
767, одна транзакция за REPL 1. Она там заблокирована, независимо от того, как долго я буду ждать.
... Пока я не выполню запрос:
(d/q '[:find (pull ?person [*])
:in $ ?person-name
:where
[?person :person/first-name ?person-name]]
(d/db conn)
"Alice")
=> []
Запрос для недавно обработанной «Алисы» возвращает пустую коллекцию, поскольку значение базы данных, возвращенное из d/db
в REPL 2, устарело. Однако действие запроса опережает базу данных, возвращенную из d/db
. Теперь он «догнал»:
(d/db conn)
=>
{:t 768,
:next-t 769,
:db-name "datomic-test",
:database-id "<some-squuid>",
:type :datomic.client/db}
И повторный запуск того же запроса возвращает данные, переданные из REPL 1:
(d/q '[:find (pull ?person [*])
:in $ ?person-name
:where
[?person :person/first-name ?person-name]]
(d/db conn)
"Alice")
=> [[{:db/id 43976067064531301, :person/first-name "Alice"}]]
У равноправного API Datomic есть функция sync , которая, похоже, решает эту проблему на месте, однако API-интерфейс Datomic Client, похоже, не имеет ничего подобного.
Учитывая, что REPL 1 и REPL 2 представляют две независимые системы, как я могу сказать им всегда использовать последнюю версию базы данных, не выполняя поддельные запросы?