撤消特定的特定更改,同时在mysql DB中保留较旧的更改

时间:2016-05-29 10:19:44

标签: mysql transactions

我想回滚一些更改,同时保留之后已完成的其他更改。

n0=20

我想要回滚更改1而不是2但是可以接受围绕我的要求的工作:

  1. 有没有办法定位更改1并且只回滚这个?
  2. 有没有办法在保留表(B)的同时回滚更改?
  3. 有没有办法可以回滚除插入之外的所有内容?
  4. 有没有办法回滚表A但不回滚其他表?
  5. 有没有办法只回滚一种类型的更改(更新)?
  6. 由于交易是原子性的,我想严格的答案是否定的,但我要求在这里开展工作。

    目前我有一些答案,其中包括将数据保存在临时表中,但它很重且不具有进化性:http://sqlfiddle.com/#!9/64d1f/1

    我的问题与以下内容有关:Nested transaction rollback between two savepoints? 但我的限制较少(你可以回答我的问题而不回答这个问题,但回答这一问题肯定会回答我的问题。)

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您希望创建一个自定义审核日志文件,以便对您回滚的内容进行非常精细的控制。 鉴于表中的行只发生了3件事(添加,更改,删除),而不是像这样设计审计日志: Id -auto增量, timestamp -date和添加,更改,删除的时间, 行动 - A,C,D, Table_id - 正在执行的表格, Before_image - 使您想要记录的表中所有字段所需的大小, After_image

从逻辑 如果你 然后INSERT插入正在执行的表和审计日志After_image 更新您从正在操作的表中插入before_image,并在更改时插入after_image。 删除在物理删除之前从正在操作的表中插入before_image

如果要回滚任何或所有这些元素,您在审核日志中有足够的信息来执行此操作。显然,回滚代码与审计日志的插入相反(插入变为删除,更新采用after_image并更新正在执行的表,删除成为从before_img到正在执行的表的插入)。 / p>