MySQLでトランザクションの途中にSTART TRANSACTIONを実行するとどうなる?暗黙的コミットの仕組みを解説
現在実行中のトランザクションの途中でSTART TRANSACTIONコマンドを実行すると、それまでのトランザクションは自動的にコミット(確定)され、終了します。つまり、そのトランザクション内で行われたすべてのデータベース変更が永続的に保存されます。
このように、明示的なCOMMIT文を実行していないにもかかわらず、別のコマンドによってトランザクションが確定される動作を「暗黙的なコミット(implicit commit)」と呼びます。
具体的な例
ここでは、テーブル「marks」に以下のデータが登録されている状態を想定します。
mysql> select * from marks; +------+---------+-----------+-------+ | Id | Name | Subject | Marks | +------+---------+-----------+-------+ | 1 | Aarav | Maths | 50 | | 1 | Harshit | Maths | 55 | | 3 | Gaurav | Comp | 69 | +------+---------+-----------+-------+ 3 rows in set (0.00 sec)
まず新しいトランザクションを開始し、2件のINSERT文を実行した後、もう一度START TRANSACTIONを実行してみます。
mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO Marks Values(4, 'Rahul','History',40); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO Marks Values(5, 'Yashraj','English',48); Query OK, 1 row affected (0.00 sec) mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec)
結果の確認
この例から分かるように、2回目のSTART TRANSACTIONステートメントが実行された時点で、最初のトランザクションは暗黙的に終了し、そこまでの変更(RahulとYashrajの2件のINSERT)がコミットされています。実際にテーブルを参照すると、ロールバックされることなくデータが確定していることが確認できます。
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 | +------+---------+-----------+-------+ 5 rows in set (0.00 sec)
注意点
この暗黙的なコミットの挙動は、意図しないデータ確定を招く可能性があるため注意が必要です。ROLLBACKで取り消したい変更がある場合は、トランザクションの途中でうっかりSTART TRANSACTIONやDDL文(CREATE TABLE、ALTER TABLEなど)を実行しないよう、トランザクションの範囲を明確に設計しておくことをおすすめします。
-
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: クエリキャッシュに割り当て