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 请求数据库。
考虑以下发生在 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 请求数据库。