clojure – 如何撤销数据库中的事务?

前端之家收集整理的这篇文章主要介绍了clojure – 如何撤销数据库中的事务?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我意外地对数据库进行了交易,我想“撤消”整个交易.我知道它是哪个事务,我可以看到它的数据,但我不知道如何从那里到一个回滚事务.

解决方法

基本步骤:

>检索您要撤消的事务中创建的数据.使用事务日志找到它们.
>删除与事务实体本身相关的数据:我们不想收回事务元数据.
>反转所有剩余数据的“添加”状态,即如果添加了数据,则将其撤回,如果已被撤销,则将其添加.
>反转倒数据的顺序,以便在重新确定旧的好值之前缩小坏的新值.
>提交一个新的事务.

在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.

猜你在找的MsSQL相关文章