【これだけ】MySQLのトランザクション【現役エンジニアが解説】

PROGRAM

今回はMySQLのトランザクションについて、事例を交えて簡単に解説していきます。

トランザクションの意味

トランザクションとは、簡単に言うと、ひとまとまりの処理のことです。

トランザクションを張るとは、この一連の処理を開始することを意味します。

SQLではトランザクションを張ることによって、何かエラーがあった際に行った処理をロールバックする(元に戻す)ことができます。

例えば、以下の例を見てみましょう。

INSERT INTO users (user_id, name) VALUES(1,'山田太郎');
INSERT INTO posts (title, body, user_id) VALUES('記事タイトル','記事本文',1);

このケースではまずはusersテーブルにユーザの新規登録を行い、そのユーザで記事をpostsテーブルに投稿しようとしているSQL文です。

ここで万が一、usersテーブルにレコードを追加する段階で失敗したとすると、2番目のpostsテーブルへの追加も取りやめにすることが一般的だと思います。

こういう場合にトランザクションが活躍します。トランザクションを使えば、1つ目のSQL文で失敗すると2つ目のSQL文は実行せず、トランザクションを開始する前の状態に戻すことができます。

MySQLでのトランザクションの使い方

MySQLでトランザクションを張る場合、「BEGIN」で開始、「ROLLBACK」で元に戻す、「COMMIT」で完了となります。

先程の例を使って、トランザクションを張ってみましょう。

BEGIN;
INSERT INTO users (user_id, name) VALUES(1,'山田太郎');
INSERT INTO posts (title, body, user_id) VALUES('記事タイトル','記事本文','1');

この後にROLLBACKもしくはCOMMITを使うことで処理を終えます。

ROLLBACKを使えば、BEGINしてから処理したものを全部元に戻し、COMMITすれば処理した内容を確定することができます。

SET autocommit=0;

MySQLでは自動コミットが有効になっていることがあるので、トランザクションを張る場合にはあらかじめ上記のように自動コミットを無効にしておきましょう。

トランザクションはアプリケーションの関数で使う

実際の現場ではBEGINやCOMMIT、ROLLBACKのSQL文を自分で発行するよりかは、アプリケーションの関数に任せることが多いです。

例えば、phpではPDOクラスに「beginTransaction()」や「commit()」や「rollBack()」という関数があるため、それらを利用しましょう。

// phpの場合

$pdo->beginTransaction(); // トランザクション開始

// 各SQL文の処理を書く

if ($result) { // 結果の内容でコミットかロールバックかを分岐
    $pdo->commit(); // 正常終了
} else {
    $pdo->rollback(); // 異常終了(リセット)
}

なぜ関数を使うかと言えば、使用するデータベースによって、微妙にトランザクションの張り方が異なるゆえ、これらの違いを吸収するためです。

phpのPDOクラスは、様々なデータベースの違いを吸収するため、MySQLだけでなく、SQLServerやOracle等の場合でも、同じ関数でトランザクションを張ることができます。