如何让两个Datomic Cloud客户端保持同步?

时间:2018-05-15 09:57:57

标签: clojure datomic

我在两个连接到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返回的数据库。现在它“赶上了”:

(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代表两个独立的系统,如何告诉他们在不执行虚假查询的情况下始终使用最新版本的数据库?

0 个答案:

没有答案