MySQLのトランザクション中にDDL文を実行するとどうなる?暗黙的コミットの仕組みを解説
現在実行中のMySQLトランザクションの途中でDDL文(データ定義言語)が実行されると、そのトランザクションは自動的にコミット(暗黙的コミット)されて終了します。対象となるDDL文には、データベースの作成(CREATE)や削除(DROP)、テーブルの作成・変更・削除(CREATE / ALTER / DROP)、さらにストアドルーチンの作成や削除などが含まれます。
つまり、トランザクション内でそれまでに行われたすべてのデータベースへの変更は確定(永続化)され、後からロールバックすることはできません。
具体例
mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO MARKS Values(6,'Manak','History',70); Query OK, 1 row affected (0.26 sec) mysql> Create table student(id int, Name Varchar(10)); Query OK, 0 rows affected (0.84 sec)
上記の例では、トランザクションを開始してINSERT文を実行した直後に、DDL文である「CREATE TABLE」を実行しています。この時点でトランザクションは暗黙的に終了し、MySQLはそれまでの変更をすべて保存します。
ROLLBACKしても元に戻らない
mysql> Rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from marks; +------+---------+-----------+-------+ | Id | Name | Subject | Marks | +------+---------+-----------+-------+ | 1 | Aarav | Maths | 50 | | 1 | Harshit | Maths | 55 | | 3 | Gaurav | Comp | 69 | | 4 | Rahul | History | 40 | | 5 | Yashraj | English | 48 | | 6 | Manak | History | 70 | +------+---------+---------+---------+ 6 rows in set (0.00 sec)
ROLLBACKを実行しても、INSERTされたデータ(Id=6のManakさんのレコード)は消えておらず、テーブルに残っていることが確認できます。これは、DDL文の実行によってトランザクションがすでにコミット済みとなり、取り消せない状態になっているためです。
開発時の注意点
長めのトランザクション処理の中でうっかりDDL文を実行すると、意図しないタイミングで変更が確定してしまう恐れがあります。トランザクションを扱う際は、DML文(INSERT、UPDATE、DELETEなど)とDDL文を混在させないようにし、スキーマ変更はトランザクションとは別に実行するのが安全です。
-
MySQL 8.0の新機能まとめ:追加された7つの主要機能を解説
本記事では、MySQL 8.0で新たに追加された主要機能についてわかりやすく解説します。セキュリティ、パフォーマンス、文字セットなど多方面にわたる改善点を確認していきましょう。セキュリティレベルの強化MySQL 8.0ではセキュリティレベルが大幅に改善され、DBA(データベース管理者)はアカウント管理においてより柔軟な運用が可能になりました。これにより、きめ細かな権限設定や安全なユーザー管理が実現しています。リソースグループリソースグループの作成と管理が可能になり、サーバー内で動作するスレッドを特定のグループのリソースに割り当てられるようになりました。グループの属性を使用することで、リソースの
-
MySQL 8.0で削除された主なオプションと変数の一覧
MySQL 8.0で削除されたオプションと変数についてMySQL 8.0では、パフォーマンス向上と機能の整理に伴い、多くの廃止予定だったオプションやシステム変数が削除されました。特に大きな変更点として、長年非推奨とされてきたクエリキャッシュ機能の完全な削除が挙げられます。ここでは、MySQL 8.0で削除された代表的なオプションと変数を、削除されたバージョンとあわせて紹介します。クエリキャッシュ関連の変数(8.0.3で削除)Qcache_free_blocks: クエリキャッシュ内の空きメモリブロック数を示すステータス変数です。Qcache_free_memory: クエリキャッシュに割り当て