MySQLの現在のトランザクションを暗黙的に終了させる4つの方法
MySQLでは、明示的にCOMMITやROLLBACKを実行しなくても、特定の操作によって現在進行中のトランザクションが自動的に終了することがあります。これを「暗黙的な終了」と呼びます。主な方法は以下の4つです。
1. DDLステートメントの実行による終了
CREATE DATABASEやDROP DATABASE、テーブルやストアドルーチンに対するCREATE・ALTER・DROPなどのDDL(データ定義言語)ステートメントを実行すると、現在のトランザクションは暗黙的に終了し、それまでの変更がコミットされます。これは、MySQLにおいてDDLステートメントがロールバック不可であるためです。
実行例
mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO MARKS Values(3,'gaurav','Comp',69); 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)
トランザクションの途中でDDLステートメントを実行したため、この時点でトランザクションは暗黙的に終了しています。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 | +------+---------+-----------+-------+ 3 rows in set (0.00 sec)
INSERTで追加したGauravの行がROLLBACK後も残っていることから、DDL実行時に変更が確定(コミット)されたことが分かります。
2. クライアントセッションの切断による終了
クライアントセッションを切断すると、そのセッションで実行中だったトランザクションは暗黙的に終了します。この場合、コミットされていない変更はすべてロールバックされます。
3. クライアントセッションの強制終了による終了
KILLコマンドなどでクライアントセッションを強制終了した場合も、現在のトランザクションは暗黙的に終了し、未コミットの変更は同様にロールバックされます。
4. START TRANSACTIONコマンドの実行による終了
新しい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の実行によって最初のトランザクションが暗黙的に終了し、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)
このように、暗黙的なトランザクションの終了では、DDLの実行や新しいトランザクションの開始の場合は変更がコミットされ、セッションの切断・強制終了の場合は変更がロールバックされるという違いがあります。意図しないデータの確定や消失を防ぐためにも、これらの動作を理解しておくことが重要です。
-
【保存版】MySQLのrootユーザーから失われた全権限を復元する方法
MySQLのrootユーザーから権限が失われてしまった場合でも、UPDATE文を使えば全権限を復元することができます。本記事では、rootユーザーの特権(Super_priv)や権限委譲権限(Grant_priv)を復旧させる具体的な手順を解説します。 手順1:mysqldを--skip-grant-tablesオプションで再起動する まず、現在稼働しているmysqld(MySQLサーバー)を停止します。その後、--skip-grant-tablesオプションを付けて再起動してください。このオプションを指定すると、権限テーブル(grant tables)が読み込まれずにサーバーが起動するため、
-
【MySQL入門】別のユーザーとしてログインする方法をわかりやすく解説
MySQLで別のユーザーとしてログインしたい場合は、mysql -u ユーザー名 -p コマンドを使用します。この記事では、新しいユーザーの作成から、作成したユーザーでのログイン方法まで、手順を追って詳しく解説します。別のユーザーとしてログインするための基本構文別のユーザーとしてMySQLにログインする際の基本構文は以下の通りです。> mysql -u yourUsername -pEnter password:コマンドを実行してEnterキーを押すと、パスワードの入力を求められます。ここに該当ユーザーのパスワードを入力すればログインできます。ステップ1:新しいユーザーを作成するまずは、