web-dev-qa-db-ja.com

MySQLでの安全なトランザクションの切り捨てと挿入

MySQL InnoDBテーブルにTRUNCATEおよびINSERTデータを書き込もうとしています。

トランザクション内のいずれかのステートメントが失敗した場合、データが変更されないことを確認したいと思いました。

何かが失敗した場合、空のテーブルや破損したテーブルを作成することはできません。

これが私が計画した方法です。

  1. BEGIN TRANSACTION
  2. TRUNCATE TABLE table_name
  3. INSERT INTO table_name
  4. COMMIT

それから私はそれを学びましたTRUNCATE TABLE table_name暗黙のCOMMITが発生する 。これにより、トランザクション全体が無意味になります。

次に、TRUNCATE TABLE table_name とともに DELETE FROM table_nameアプローチ、これは理想的ではありませんでしたが、それも 暗黙的なCOMMITの原因

DROP TABLE table_nameおよびCREATE TABLE table_nameは暗黙的なCOMMITも引き起こします!

私がやろうとしていることを実行するには、どの方法/ロジックが最適ですか?

Windows Server 2008 R2で実行されているMySQL 5.6.17 64ビットサーバーの使用

5
Clarkey

TRUNCATE TABLEは暗黙的なコミットを行うため、それを使用しないでください

テーブルに外部キーがない限り、次のようにすばやく実行できます。

CREATE TABLE mytable_new LIKE mytable; 
RENAME TABLE mytable TO mytable_old,mytable_new TO mytable;
INSERT INTO mytable ... ;

INSERTが成功した場合、これを実行します

DROP TABLE mytable_old;

INSERTがロールバックした場合、元に戻す

RENAME TABLE mytable TO mytable_zap,mytable_old TO mytable;
DROP TABLE mytable_zap;

試してみる !!!

4
RolandoMySQLDBA
DELETE FROM t

notは暗黙のコミットを引き起こし、うまく機能するはずです。私は実際にこの正確なソリューションを本番環境で使用しており、トランザクションの問題はありません(もちろん、大きなテーブルからすべての行を削除すると、トランザクションのサイズに大きな影響があり、IOの増加、バイナリログのサイズの増加などが続く可能性があります) 。)

4
Shlomi Noach