MySQL - トランザクション:入門ガイド

こんにちは、未来のデータベースの魔法使いたち!今日は、MySQLのトランザクションの世界に興味深い旅に出発します。プログラミングが初めての方でも心配しないでください。私はあなたの親切なガイドとして、複雑な概念を小さな、噛みやすいチャンクに分解します。お気に入りの飲み物を手に取り、一緒に潜りましょう!

MySQL - Transactions

MySQLのトランザクション

銀行で預金口座から当座口座への振込を行っていると想像してください。預金口座からお金が消えて、当座口座に現れないのはまずいでしょう?それがトランザクションが役に立つところです!

MySQLでは、トランザクションは一連の操作を単一の作業単位として処理します。データベース操作のセットを守る保護泡のように、すべてが成功するかすべてが失敗するかを確保します。

簡単な例を見てみましょう:

START TRANSACTION;
UPDATE savings_account SET balance = balance - 100 WHERE account_id = 123;
UPDATE checking_account SET balance = balance + 100 WHERE account_id = 456;
COMMIT;

このトランザクションでは、100ドルを預金口座から当座口座に移動しています。START TRANSACTIONコマンドでトランザクションを開始し、最後のCOMMITコマンドで変更を永久的に保存します。

トランザクションのプロパティ

MySQLのトランザクションはACIDプロパティに従います。ラボで見つけるような酸ではありません!ACIDは以下の意味です:

  1. 原子性(Atomicity):トランザクション内のすべての操作が成功するかすべてが失敗します。
  2. 一貫性(Consistency):トランザクションの前後でデータベースは一貫した状態です。
  3. 分離性(Isolation):トランザクションは完了するまで他のトランザクションから分離されています。
  4. 耐久性(Durability):トランザクションがコミットされると、システム障害が発生した場合でもその状態は保持されます。

ACIDはデータベース操作の守護天使のように、すべてがきれいに整理された状態を保つ役割を果たします!

MySQLのトランザクションステートメント

MySQLにはトランザクションを管理するための複数のステートメントがあります。以下の表に示します:

ステートメント 説明
START TRANSACTION 新しいトランザクションを開始します
COMMIT データベースに変更を永久的に保存します
ROLLBACK 現在のトランザクションで行われた変更を取り消します
SET autocommit オートコミットモードを有効または無効にします
SAVEPOINT トランザクション内に checkpoint を作成し、後で rollback できるようにします

これらのステートメントを詳しく見ていきましょう。

COMMITコマンド

COMMITコマンドはトランザクションの「保存」ボタンです。コミットすると、行ったすべての変更が永久的になります。

START TRANSACTION;
INSERT INTO students (name, age) VALUES ('Alice', 20);
INSERT INTO students (name, age) VALUES ('Bob', 22);
COMMIT;

このCOMMIT後、AliceとBobは正式にstudentsテーブルに加わります。ようこそAliceさん、Bobさん!

AUTOCOMMITコマンド

デフォルトでは、MySQLはオートコミットモードで動作しており、各ステートメントが個別のトランザクションとして処理されます。以下のようにオフにできます:

SET autocommit = 0;

今度は手動で変更をコミットする必要があります。ゲームのオートセーブをオフにすることと似ています。定期的に保存(コミット)を忘れないようにしましょう!

ROLLBACKコマンド

ROLLBACKは「 undo 」ボタンです。トランザクション内で何かが間違った場合、ROLLBACKを使用してすべての変更を元に戻すことができます。

START TRANSACTION;
DELETE FROM students WHERE name = 'Alice';
-- あやしい!Aliceを削除するつもりはなかった!
ROLLBACK;

アハ!Aliceはデータベースに無事にいます。ROLLBACKはまだコミットされていない変更に対してのみ機能します。

SAVEPOINTコマンド

SAVEPOINTはトランザクション内にcheckpointを作成し、必要に応じてその点にroll backすることができるようにします。

START TRANSACTION;
INSERT INTO students (name, age) VALUES ('Charlie', 21);
SAVEPOINT charlie_added;
INSERT INTO students (name, age) VALUES ('David', 23);
-- あやしい!Charlieだけを追加したいいただけだ!
ROLLBACK TO SAVEPOINT charlie_added;
COMMIT;

このシナリオでは、Charlieがクラスに加わりますが、Davidは選ばれません。ごめんなさい、Davidさん!

トランザクション-safeなMySQLのテーブルタイプ

MySQLのすべてのテーブルタイプがトランザクションをサポートしているわけではありません。主なトランザクション-safeなストレージエンジンは以下の通りです:

  1. InnoDB
  2. NDB Cluster

InnoDBは最も一般的に使用されており、最近のMySQLバージョンではデフォルトとなっています。InnoDBはスイスアーミーナイフのように、多様で信頼性があります!

クライアントプログラムを使用したトランザクション

コマンドラインクライアントなどのMySQLクライアントプログラムを使用して、ここで説明した同じトランザクションコマンドを使用できます。以下に小さなストーリーを示します:

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

mysql> INSERT INTO pet_shop (pet_name, species) VALUES ('Fluffy', 'cat');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO pet_shop (pet_name, species) VALUES ('Rover', 'dog');
Query OK, 1 row affected (0.01 sec)

mysql> COMMIT;
Query OK, 0 rows affected (0.02 sec)

そして、フラッフィーという猫とロバーという犬がペットショップデータベースに新たな家を見つけました!

データの整合性を保つためのトランザクションはあなたの友です。計画どおりに進まない場合でも、データベース操作が信頼性のあるものになります。トランザクションを使用したMySQL操作を練習し、データベースの名人になるまで努力してください!

今日のMySQLトランザクションに関するレッスンはここまでです。この旅を楽しんでいただけたことを願っています。練習を続け、好奇心を持ち続け、ハッピーコーディングを!

Credits: Image by storyset