2016-05-29 17 views
0

その後に行われた他の変更を保存しながら、いくつかの変更をロールバックしたい。mysql DBに古い変更を保存しながら特定の特定の変更を元に戻す

Change 1 (update statement on table A) 
Change 2 (insert statement on table B using table A) 

私は、変更1をロールバックする必要はなく、2が、私の要件の周りの仕事を受け入れることができます。

  1. は、変更1をターゲットとし、これだけをロールバックする方法はありますか?
  2. テーブル(B)を保持している間に変更をロールバックする方法はありますか?
  3. 挿入を除いてすべてをロールバックする方法はありますか?
  4. テーブルAをロールバックする方法はありますか?他のテーブルはロールバックできませんか?
  5. 1つのタイプの変更(更新)のみをロールバックする方法はありますか?

トランザクションはアトミックなものであるため、厳密な答えは「いいえ」だと思いますが、ここでは回避策を求めています。

私は、一時テーブル内のデータを保存するように構成され、現時点での答えのようなものを持っているが、それは重いと進化のではない:http://sqlfiddle.com/#!9/64d1f/1私の質問は以下に関連している

Nested transaction rollback between two savepoints? しかし鉱山は制限の少ないです(あなたはこれに答えることなく私の質問に答えることができますが、これに答えることは間違いなく私に答えるでしょう)。

答えて

0

私があなたの質問を正しく理解している場合は、ロールバックする内容を細かく制御できるようにカスタム監査ログファイルを作成することをお勧めします。 ID:-auto increment、 timestamp - 追加、変更、削除、および削除の時刻が の場合、テーブル内の行に発生する可能性があるのは3つだけです(追加、変更、削除) アクション - A、C、D、 TABLE_ID -theテーブルがactionedされ、 Before_image - あなたはあなたがログインしたいテーブルのすべてのフィールドに必要になると思うと、これは同じ大きさにし、 After_image

論理的に INSERTすると、実行中のテーブルに挿入し、監査ログAfter_image UPDATEを実行すると、実行中のテーブルからbefore_imageが挿入され、after_imageには変化。 物理的に削除する前に、実行中のテーブルからbefore_imageを挿入してください。

これらの要素の一部またはすべてをロールバックする場合は、監査ログに十分な情報があります。明らかに、ロールバックコードは監査ログへの挿入と逆です(挿入は削除になり、更新はafter_imageをとり、実行中のテーブルを更新し、削除はbefore_imgから実行中のテーブルへの挿入になります)。

+0

すべての変更を記録し、十分な情報を保持するログファイルを作成して、反対の変更を適用できるように助言します。 前の状態に移動するのではなく、逆方向に同じ距離に移動します。 私はこれを行うことができると思う、それは強力でかなり軽い(CPU使用率で)。 私はそれが達成されることを検証します。 –

関連する問題