2011/12/02

【PHP】PHP+MySQLでトランザクション【MySQL】

PHP+MySQLでトランザクションをするお話です。

基本的にPHPでシステム開発を行うときは何かしらのフレームワークを使うことが多いですが、
今回はPHPのベタ書きでMySQLのトランザクション処理の仕組みについて書いてみたいと
思います。

まずトランザクション処理とは
複数テーブルの更新や挿入など別々のテーブルがお互いを参照するようなデータを
操作するときに使います。

例えば、テーブルAとテーブルBがあるとします。
テーブルBではテーブルAのPKをFKとして参照しているといった場合にどちらか一方が
こけてしまった場合データの整合性がとれなくなるためシステムを破壊しかねないです。

ですのでこのような更新をDBで行う場合はトランザクション処理は必須となります。

今回はざっくり書いてみます。
<?php

// 接続文字列
$server = 'サーバ名';
$db     = 'DB名';
$user   = 'ユーザ名';
$pass   = 'パスワード';

// MySQL接続
$con = @mysql_connect($server, $user, $pass);
if (!$con)
{
    exit('DBに接続できませんでした。');
}

// DB選択
mysql_select_db($db, $con);

try
{
    // 自動コミットをオフ
    $query = 'set autocommit = 0';
    mysql_query($query, $con);

    // トランザクションスタート
    $query = 'begin';
    mysql_query($query, $con);

    // DBにデータをINSERT
    $query  = "insert info `emp` (`id`, `name`)values('0001', 'user')";
    $result = mysql_query($query, $con);

    // クエリが成功したかどうかのチェック
    if ($result === true)
    {
        // 正常終了なのでコミット
        $query = 'commit';
        mysql_query($query, $con);
        echo 'コミットしました。';
    }
    else
    {
        // 更新失敗なのでロールバック
        $query = 'rollback';
        mysql_query($query, $con);
        echo 'ロールバックしました。';
    }

}
catch (Exception $e)
{
    // 例外が発生したのでロールバック
    $query = 'rollback';
    mysql_query($query, $con);
    echo 'ロールバックしました。';
}

// 接続をクローズ
mysql_close($con);
このような流れになるかと思います。 また、MySQLには罠がありまして、デフォルトで自動でコミットされるようになっております。 それをtryの直後に「set autocommit = 0」でオフにしています。 autocommitが1の場合はトランザクション処理中であろうともクエリが成功した場合 その場でコミットされてしまいます。 終わり

0 件のコメント:

コメントを投稿