PR

【SQL】BEGIN/START TRASACTIONを3分でわかりやすく

Database

BEGIN / START TRANSACTION はデータベースにおいてトランザクションを開始するために使用されます。

BEGIN;
-- または
START TRANSACTION;

参考 トランザクションとは?

このページではトランザクションの(BEGIN/START TRANSACTION)の基本、 COMMIT / ROLLBACK の仕組みを3分でわかりやすく解説します。

このページで学べる内容
  • トランザクションとは?
  • BEGIN / START TRANSACTIONの使い方
  • COMMIT(トランザクションの確定)
  • ROLLBACK(トランザクションの取り消し)

プログラマーやエンジニアを目指す方であれば知らないと恥ずかしい基本知識です。是非最後までご覧ください。

スポンサーリンク

トランザクションとは?わかりやすく

トランザクションとは、データベースに対する一連の操作(データの追加/更新/削除)をひとまとめにしたものです。

例えば、銀行の送金処理を考えてみましょう。あるユーザーAがユーザーBにお金を送金する場合、以下の2つの操作が必要です。

  1. ユーザーAの口座から送金額を引き落とす。
  2. ユーザーBの口座に送金額を加算する。

これら2つの操作は、どちらも成功するか、どちらも失敗するかのどちらかでなければなりません。もし1つ目の操作が成功して2つ目の操作が失敗した場合、お金が消失することに。逆の場合はお金が誕生してしまうことになります。

上記2つの処理のまとまりを1つのトランザクションとしてまとめ、どちらか一方だけが成功してしまうなどのデータベース内での不整合を防ぐのが主な役割です。

トランザクションとは
  • データベースにおいて一連の操作をひとまとめにし、データの整合性と安全性を保つための仕組み

トランザクションを理解するうえで押さえておきたいのがACID特性です。ACID特性って何?という方は以下の記事をご覧ください。

BEGIN / START TRANSACTION(トランザクションの開始)

AUTOCOMMIT(オートコミット)

多くのDBMSではトランザクションの開始・終了が自動で行われる設定になっています。

参考 DBMSとは?

つまりBEGIN/START TRANSACTIONをDBMSが勝手に実行してくれている状態。

学習のために、オートコミットを解除したい場合は以下を参考にモード切替を実行してください。

SELECT @@autocommit;

/* 1 なのでオートコミットモード
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
*/

-- オートコミット解除
SET AUTOCOMMIT = 0;

/* 0 なのでオートコミット解除
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
*/

-- オートコミット設定
SET AUTOCOMMIT = 1;

/* 1 なのでオートコミットモード
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
*/

トランザクションを開始するには以下のSQL文を実行します。

BEGIN;
-- または
START TRANSACTION;

上記でトランザクションが開始します。

トランザクションが開始されている間は、INSERT文UPDATE文などを実行しても、データベースには結果が反映されません。COMMIT or ROLLBACKを実行するまではレコードの変更は "仮確定" のような扱いになります。

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の処理の違いです。

このページのまとめ
  • トランザクションとは、データベースに対する一連の操作(データの追加/更新/削除)をひとまとめにしたもの
  • BEGIN or START TRANSACTION でトランザクションを開始
  • COMMIT でトランザクション確定
  • 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 |
+----+------+---------+
*/

SQLを1から学習したい方は

SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。

SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?

とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
DatabaseIT-Skills
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました