Developer

【SQL基礎】トランザクションとは
2020.11.30
Lv1

【SQL基礎】トランザクションとは

DBMSには、正確なデータ処理を保証するための機能としてトランザクションというものが用意されています。
本項では、そのトランザクションについて見ていきます。


トランザクションとは

トランザクションとは、簡潔にいうと「1つ以上のSQL文を一塊の処理単位としたもの」です。

どのような場合にトランザクションが必要かというと、例えば、上記図のような一連の複数のデータ処理を実行中に処理が中断されては困るような場合等になります。
なぜなら、トランザクションは、一連のすべての処理が成功し結果を反映させるか、すべてまたは一部が失敗しすべての処理を取り消すかというどちらかの状態になるように制御するからです。

もっと具体的に、トランザクションの説明として代表的な銀行の口座振込処理を例に見てみましょう。

Aさんが会社Bから通販で1万円分の商品を買ったので、Aさんの口座から会社Bの口座に1万円を振り込んだとします。
この場合、「Aさんの口座残高から1万円を差し引く」、「会社Bの口座残高を1万円増やす」という2つの処理を実行する必要があります。
ここでもし、「Aさんの口座残高から1万円を差し引く」の処理のみ成功し、「会社Bの口座残高を1万円増やす」という処理が何らかの原因で失敗してしまった場合、Aさんの口座残高は1万円減ったのにもかかわらず、会社Bの口座残高が増えないという大変まずい状態になります。
この問題は、二つの処理を一つのトランザクションとして扱うことでクリアできます。
前述のように、トランザクションは一連の処理が途中で失敗した場合、半端に成功している処理結果を取り消すことができるからです。


トランザクションの構文

トランザクションの構文は以下になります。

トランザクション開始文;

SQL文;
SQL文;
・
・
・

トランザクション終了文;

このように、一つのトランザクションにまとめたいものを開始文と終了文で囲んで指定します。
MySQLでは「START TRANSACTION」もしくは「BEGIN」がトランザクションの開始文、「COMMIT」または「ROLLBACK」がトランザクションの終了文となります。

例えば、以下のようなclassテーブルがあったとします。

このテーブルに対し、数学から英語に変更し、新しく物理の行を挿入する処理を一つのトランザクションで実行したい場合は以下のようになります。

START TRANSACTION;

UPDATE class
SET name = "英語";

INSERT INTO class
VALUES (2, "物理");

COMMIT;

SELECT *
FROM class;

COMMITとROLLBACKについては次回で説明していきます。


今回の学習ポイント

・トランザクションとは、「1つ以上のSQL文を一塊の処理単位としたもの」。
・トランザクションは、一連のすべての処理が成功した場合のみ結果を反映させ、失敗した場合はすべての処理の結果を取り消す


練習問題

問題として使用するデータは「SQL練習問題」のものを使用しています。
以下からダウンロード可能です。
また、ダウンロードしたら以下のようにしてworldcup2014データベースを作成し、インポートしてください。
※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。

worldcup2014.zip

[sql] CREATE DATABASE worldcup2014;

use worldcup2014

source C:\worldcup2014.sql
[/sql]

1.トランザクションの開始文は「START TRANSACTION」ともう一つはなにか。

答え
[sql] BEGIN;
[/sql]

新しいトランザクションは、「START TRANSACTION」または「BEGIN」で開始することができます。

2.goalsテーブルにブラジルvsクロアチア戦(pairings.id=1)で前半10分にフレジ(players.id=19)がゴールを決めたデータ挿入処理をトランザクション開始を宣言して実行してください。
なお、トランザクションの終了文はROLLBACKとする。

答え
[sql] START TRANSACTION;

INSERT INTO goals (pairing_id, player_id, goal_time)
VALUES (1, 19, "前半10分");

ROLLBACK;
[/sql]

トランザクションの開始を宣言している「START TRANSACTION」の部分は「BEGIN」でも構いません。
また、INSERT文のところは、問題文のデータが挿入できるものであれば、上記例以外の記述のしかたでも構いません。

 

 

連載目次リンク

SQL基礎 連載目次

関連する連載リンク

SQL練習問題 一覧まとめ