我在两个连接到Datomic Cloud中的同一个数据库的REPL中打开了两个Datomic clients . 在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")
=> []
查询最近交易的"Alice"返回一个空集合,因为从REPL 2中的 d/db
返回的数据库值是旧的 . 但是,查询操作会提升从 d/db
返回的数据库 . 现在是"caught up":
(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"}]]
Datomic的对等API有一个sync函数,它似乎解决了本地的这个问题,但是Datomic Client API似乎没有任何类似的东西 .
鉴于REPL 1和REPL 2代表两个独立系统,如何在不执行伪造查询的情况下告诉他们始终使用最新版本的数据库?