我有两个Datomic客户端在两个连接到Datomic Cloud中相同数据库的REPL中打开.在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 {}}
Run Code Online (Sandbox Code Playgroud)
(d/db conn)
=>
{:t 768,
:next-t 769,
:db-name "datomic-test",
:database-id "<some-squuid>",
:type :datomic.client/db}
Run Code Online (Sandbox Code Playgroud)
REPL 2
我得到了最新的已知数据库值,但它仍然存在 {:t 767}
(d/db conn)
=>
{:t 767,
:next-t 768,
:db-name "datomic-test",
:database-id "<some-squuid>",
:type :datomic.client/db}
Run Code Online (Sandbox Code Playgroud)
反复调用d/db将永远在:t767 处返回数据库,一个事务在REPL 1之后.无论我等待多久,它都会锁定在那里.
...直到我运行查询:
(d/q '[:find (pull ?person [*])
:in $ ?person-name
:where
[?person :person/first-name ?person-name]]
(d/db conn)
"Alice")
=> []
Run Code Online (Sandbox Code Playgroud)
查询最近交易的"Alice"会返回一个空集合,因为从d/dbREPL 2 返回的数据库值是旧的.但是,查询操作会提升从中返回的数据库d/db.现在它"赶上了":
(d/db conn)
=>
{:t 768,
:next-t 769,
:db-name "datomic-test",
:database-id "<some-squuid>",
:type :datomic.client/db}
Run Code Online (Sandbox Code Playgroud)
并重新运行相同的查询返回从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"}]]
Run Code Online (Sandbox Code Playgroud)
Datomic的peer API有一个sync函数,它似乎解决了本地的这个问题,但是Datomic Client API似乎没有类似的东西.
鉴于REPL 1和REPL 2代表两个独立系统,如何在不执行伪造查询的情况下告诉他们始终使用最新版本的数据库?