MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

トランザクションの途中でセッションが終了すると、MySQLのトランザクションはどうなる?

トランザクションの実行中にセッションが終了した場合、MySQLはそのトランザクションを自動的にロールバックして終了させます。これは、コミットされていないトランザクション内で行われたデータベースへのすべての変更が取り消されることを意味します。このように、セッションの終了をきっかけにMySQLが自動的に実行するロールバックのことを暗黙的ロールバック(implicit rollback)と呼びます。

なぜ暗黙的ロールバックが発生するのか

MySQLでは、トランザクションの整合性を保つために、接続が切断されると未完了のトランザクションをコミットせずに破棄します。ユーザーが明示的にCOMMITを実行していない以上、変更を確定すべきではないと判断されるためです。これにより、意図しない中途半端なデータ状態がデータベースに残ることを防いでいます。

具体例

例として、テーブル「marks」に以下のようなデータが格納されている場合を考えてみましょう。

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)

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE marks SET Name = 'Yash' Where id = 5;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> quit;
Bye

上記の例では、UPDATE文でテーブルの値を更新した後、quitステートメントを実行してセッションを終了しています。その後、改めてセッションを開始してテーブルの中身を確認すると、先ほどの更新内容は反映されていません。これは、トランザクションの途中(COMMITを実行する前)でセッションが終了したため、MySQLによって変更がロールバックされたからです。

ポイントまとめ

  • トランザクション中にセッションが切断されると、未コミットの変更はすべて取り消される。
  • この自動的な取り消しを「暗黙的ロールバック」と呼ぶ。
  • 変更を確定したい場合は、セッションを終了する前に必ずCOMMITを実行する必要がある。
  1. MySQLにおけるEXCEPTの代替方法:NOT IN演算子を使った差集合の取得手順を解説

    MySQLにはEXCEPT句が存在しない? SQL標準には、2つの結果セットの差を求めるためのEXCEPT演算子があります。しかし、従来のMySQLではEXCEPTを利用できないため、代わりにNOT IN演算子を使用するのが一般的な方法です。 この記事では、実際にテーブルを作成しながら、NOT IN演算子を使ってEXCEPTと同じ結果(差集合)を取得する手順を詳しく解説します。 サンプルテーブルの作成 まず、比較元となる1つ目のテーブルを作成します。 mysql> create table DemoTable ( Number1 int ); Query OK,

  2. MySQLのエイリアスでASキーワードは省略できる?使い方を実例付きで解説

    MySQLでは、カラムにエイリアス(別名)を付ける際、ASキーワードを明示的に書く方法とASを省略する方法の2通りがあります。どちらの書き方でも同じ結果が得られますが、この記事では実際のSQL文の例を通して、それぞれの使い方と実行結果を詳しく解説します。準備:サンプルテーブルの作成まず、以下のコマンドでテーブルを作成します。mysql> create table DemoTable     (     Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,  &nbs