BEGIN / START TRANSACTION はデータベースにおいてトランザクションを開始するために使用されます。
BEGIN; -- または START TRANSACTION;
参考 トランザクションとは?
このページではトランザクションの(BEGIN/START TRANSACTION)の基本、 COMMIT / ROLLBACK の仕組みを3分でわかりやすく解説します。
プログラマーやエンジニアを目指す方であれば知らないと恥ずかしい基本知識です。是非最後までご覧ください。
トランザクションとは?わかりやすく
トランザクションとは、データベースに対する一連の操作(データの追加/更新/削除)をひとまとめにしたものです。
例えば、銀行の送金処理を考えてみましょう。あるユーザーAがユーザーBにお金を送金する場合、以下の2つの操作が必要です。
- ユーザーAの口座から送金額を引き落とす。
- ユーザーBの口座に送金額を加算する。
これら2つの操作は、どちらも成功するか、どちらも失敗するかのどちらかでなければなりません。もし1つ目の操作が成功して2つ目の操作が失敗した場合、お金が消失することに。逆の場合はお金が誕生してしまうことになります。
上記2つの処理のまとまりを1つのトランザクションとしてまとめ、どちらか一方だけが成功してしまうなどのデータベース内での不整合を防ぐのが主な役割です。
BEGIN / START TRANSACTION(トランザクションの開始)
トランザクションを開始するには以下のSQL文を実行します。
BEGIN; -- または START TRANSACTION;
上記でトランザクションが開始します。
COMMIT(トランザクションの確定)
COMMIT;
トランザクションを確定する場合には、COMMITを実行します。
先ほどの銀行送金の処理を例に一連のトランザクション処理を考えてみます。以下のようなテーブルとレコードを用意します。
-- テーブル作成 CREATE TABLE accounts ( id INT PRIMARY KEY AUTO_INCREMENT, user VARCHAR(50) NOT NULL, balance DECIMAL(10, 2) NOT NULL ); -- レコードの登録 INSERT INTO accounts (user, balance) VALUES ('A', 1000); INSERT INTO accounts (user, balance) VALUES ('B', 500);
参考:CREATE TABLE / INSERT
/* 実行前 +----+------+---------+ | id | user | balance | +----+------+---------+ | 1 | A | 1000.00 | | 2 | B | 500.00 | +----+------+---------+ */ -- トランザクションの開始 ---------------------------------- BEGIN; -- 送金処理 UPDATE accounts SET balance = balance - 100 WHERE user = 'A'; UPDATE accounts SET balance = balance + 100 WHERE user = 'B'; -- トランザクションの終了(確定)---------------------------- COMMIT; /* 結果 +----+------+---------+ | id | user | balance | +----+------+---------+ | 1 | A | 900.00 | | 2 | B | 600.00 | +----+------+---------+ */
ご覧のように2つのUPDATE文が正常に実行されました。
ROLLBACK(トランザクションの取り消し)
トランザクションを取り消す場合はROLLBACKを用います。
先ほどと同じ例を用いてご説明します。
/* 実行前 +----+------+---------+ | id | user | balance | +----+------+---------+ | 1 | A | 1000.00 | | 2 | B | 500.00 | +----+------+---------+ */ -- トランザクションの開始 ---------------------------------- BEGIN; -- 送金処理 UPDATE accounts SET balance = balance - 100 WHERE user = 'A'; UPDATE accounts SET balance = balance + 100 WHERE user = 'B'; -- トランザクションの取り消し---------------------------- ROLLBACK; /* 結果は実行前と変化なし +----+------+---------+ | id | user | balance | +----+------+---------+ | 1 | A | 1000.00 | | 2 | B | 500.00 | +----+------+---------+ */
ご覧のようにトランザクション(2つのUPDATE文)がROLLBACKで取り消されたので、レコードの値に変更はありませんでした。これがCOMMITとROLLBACKの処理の違いです。
SQLを1から学習したい方は
SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。
SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?
とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。