解决方法
基本步骤:
>检索您要撤消的事务中创建的数据.使用事务日志找到它们.
>删除与事务实体本身相关的数据:我们不想收回事务元数据.
>反转所有剩余数据的“添加”状态,即如果添加了数据,则将其撤回,如果已被撤销,则将其添加.
>反转倒数据的顺序,以便在重新确定旧的好值之前缩小坏的新值.
>提交一个新的事务.
在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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。