如何在datomic中撤消或撤消事务?

Fra*_*ila 14 clojure datomic

我意外地向datomic提交了一个事务,我想"撤消"整个事务.我确切知道它是什么交易,我可以看到它的数据,但我不知道如何从那里得到回滚交易.

Fra*_*ila 21

基本程序:

  1. 检索要撤消的事务中创建的数据.使用事务日志来查找它们.
  2. 删除与事务实体本身相关的数据:我们不想撤消事务元数据.
  3. 反转所有剩余数据的"已添加"状态,即,如果添加了数据,则将其缩回,如果已撤消,则添加它.
  4. 反转反转数据的顺序,以便在重新声明旧的良好值之前收回坏新值.
  5. 提交新交易.

在Clojure中,您的代码如下所示:

(defn rollback
  "Reassert retracted datoms and retract asserted datoms in a transaction,
  effectively \"undoing\" the transaction.

  WARNING: *very* naive function!"
  [conn tx]
  (let [tx-log (-> conn d/log (d/tx-range tx nil) first) ; find the transaction
        txid   (-> tx-log :t d/t->tx) ; get the transaction entity id
        newdata (->> (:data tx-log)   ; get the datoms from the transaction
                     (remove #(= (:e %) txid)) ; remove transaction-metadata datoms
                     ; invert the datoms add/retract state.
                     (map #(do [(if (:added %) :db/retract :db/add) (:e %) (:a %) (:v %)]))
                     reverse)] ; reverse order of inverted datoms.
    @(d/transact conn newdata)))  ; commit new datoms.
Run Code Online (Sandbox Code Playgroud)

  • @FelipeMicaroniLalli考虑:1)在大多数数据库系统中,这是不可能的2)由于tx本身不会停止存在,因此没有一个被理解为"恢复"tx的含义.这与恢复旧的git提交是一样的问题:它可能需要手动合并才有意义. (7认同)
  • 我想澄清点(4)不是必需的 - 事务不是一个过程,事务中的Datoms顺序无关紧要.此博客文章中还提供了有关处理不良数据的更多信息(以及为什么坏数据的记录在系统推理方面可能有用):http://blog.datomic.com/2014/08/stuff-happens-fixing -bad数据合datomic.html (5认同)
  • 看起来很糟糕.恢复整个事务是非常有用的,它应该是原生的,更容易的. (2认同)