Datomic:在 Peer 上,Connection.db() 是否在 Connection.transact() 之后读取您的写入

Datomic: on a Peer, does Connection.db() read your writes after Connection.transact()

考虑以下发生在 Datomic Peer 中的操作:

(require '[datomic.api :as d])

(let [;; running a transaction and awaiting completion
      tx-res @(d/transact-async conn tx-data)
      ;; reading the current database value
      db1 (d/db conn)]
  ,,,)

在 Datomic 的一致性模型中,我可以期望 tx-res 所做的更改在 db1 中可见吗?

(我都知道 :db-after (d/sync conn t),但是依赖于读取你在连接上的写入是可行的,例如在连接上进行连续写入而不必携带数据库值)。

瓦尔,

是的,db1 将包括在交易中所做的更改。但是,这种方法被认为是不好的做法,因为您正在读取相同的值两次(tx-res 已经具有结果数据库的值)。此外,您无法保证 db1 与交易中的 :db-after 相同 数据库值。

我们强烈建议使用从事务返回的 :db-after 进行后续读取。

-马歇尔

不看代码就无法确定数据实现

但是据我对数据缓存的了解

由于 tx 被取消引用,"this" jvm 返回 "live index",因此,(>= (d/basis-t (d/db conn)) (d/basis-t db-after))> 可能发生在 2 个并发事务的情况下,

  • 线程 1 交易
  • 线程 2 交易
  • !transactor 做 1,然后 2!
  • 线程 2 取消引用
  • 线程 1 取消引用
  • 线程 1 请求数据库。