Datomic:在Peer上,Connection.db()在Connection.transact()

时间:2017-12-07 10:57:42

标签: consistency datomic

考虑以下操作,发生在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) categories A and B,但依赖于读取连接上的写入是可行的,例如在连接上进行连续写入而不必携带数据库值)

2 个答案:

答案 0 :(得分:1)

缬氨酸,

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

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

-Marshall

答案 1 :(得分:0)

无法查看代码

,无法确定数据库实现

但是根据我对数据库缓存的理解

因为tx被解雇了,"这个" jvm返回"实时索引",所以,(>= (d/basis-t (d/db conn)) (d/basis-t db-after))。 如果发生2个并发事务,可能会发生>

  • 主题1交易
  • 线程2交易
  • !transactor做1,然后2!
  • thread 2 deref
  • thread 1 deref
  • 主题1要求db。