MySQL InnoDBテーブルにTRUNCATE
およびINSERT
データを書き込もうとしています。
トランザクション内のいずれかのステートメントが失敗した場合、データが変更されないことを確認したいと思いました。
何かが失敗した場合、空のテーブルや破損したテーブルを作成することはできません。
これが私が計画した方法です。
BEGIN TRANSACTION
TRUNCATE TABLE table_name
INSERT INTO table_name
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ビットサーバーの使用
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;
試してみる !!!
DELETE FROM t
notは暗黙のコミットを引き起こし、うまく機能するはずです。私は実際にこの正確なソリューションを本番環境で使用しており、トランザクションの問題はありません(もちろん、大きなテーブルからすべての行を削除すると、トランザクションのサイズに大きな影響があり、IOの増加、バイナリログのサイズの増加などが続く可能性があります) 。)