Datomic: на узле Connection.db() читает ваши записи после 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), но может быть практичным полагаться на чтение ваших записей в соединении, например, для выполнения последовательных записей в соединении без необходимости переноса значений базы данных).


person Valentin Waeselynck    schedule 07.12.2017    source источник


Ответы (2)


Вал,

Да, db1 будет включать изменения, внесенные в транзакцию. Однако этот подход считается плохой практикой, так как вы дважды читаете одно и то же значение (tx-res уже имеет значение результирующего db). Кроме того, вам не гарантируется, что db1 является тем же значением базы данных, что и :db-after из транзакции.

Мы настоятельно рекомендуем использовать :db-after, возвращенный транзакцией, для последующего чтения.

-Маршалл

person Marshall    schedule 07.12.2017
comment
Спасибо @Marshall. Плохая практика или нет, мне действительно нужно знать, каково указанное поведение, поскольку цель состоит в том, чтобы заставить библиотеку Datomock соответствовать поведению Datomic. - person Valentin Waeselynck; 07.12.2017

Невозможно быть уверенным в реализации datomic, не видя кода

Но из того, что я понимаю о datomic cache

поскольку tx был удален, «этот» jvm возвращает «живой индекс», поэтому (>= (d/basis-t (d/db conn)) (d/basis-t db-after)). > может возникнуть в случае 2 одновременных транзакций,

  • поток 1 транзакция
  • поток 2 транзакция
  • !transactor сделать 1, затем 2!
  • нить 2
  • нить 1
  • поток 1 запрашивает db.
person souenzzo    schedule 07.12.2017