SQL

MySQLのトランザクション

2012年02月06日
MySQLでトランザクションを切るようにコーディングしていました。
これをテストしようと、エラーを起こして、ロールバックしてみたのですが・・・
なぜかロールバックされません。エラーは起きています。
何度やってもダメです。何が原因なんでしょう。

調べてみると、MySQLには、様々なテーブルがあり、テーブルの種類によってできることとできないこと、特徴が異なるようです。
メジャーなものに、【MyISAM】と【InnoDB】があります。
今回問題になっているトランザクションは、【MyISAM】ではできないことが判明しました。
MySQL、MyISAMとInnoDBを選ぶ方法
(このサイトは、やたらと何かを読み込んでいるようで、滅茶苦茶遅い。ブラウザがかたまる可能性あり)
[MySQLウォッチ]第20回
辺りが参考になります。

しかも、デフォルトだと【MyISAM】が作られるようです。
ううん、トランザクションくらいは普通に使いたいと思うんですが、そうでもないのかなぁ。

パフォーマンスは落ちるようですが、トランザクションは必要なので、テーブルタイプを【InnoDB】に変更してみました。
MySQLの基礎を学ぼう
今回はロックをかけるほどの精度はいらないので、ロックについてはスルーします。

トランザクションを始める前に、オートコミットをオフにする必要がある場合もあるようです。まぁ、オフになっていても、安全のためオフにすればよいと思います。
トランザクションを始める前に、
mysql_query("set autocommit = 0", MySQLへの接続変数);
でオフにできます。

PHPからMySQLへの接続をまとめると、
 mb_language("uni");
 mb_internal_encoding("utf-8");
 mb_http_input("auto");
 mb_http_output("utf-8");
 $objMySQLConID = mysql_connect(MySQLのホスト名, MySQLのID, MySQLのパスワード);
 mysql_query("set names utf8", $objMySQLConID);
 $blnSelDB = mysql_select_db(MySQL名, $objMySQLConID);
 mysql_query("set autocommit = 0", $objMySQLConID);
 mysql_query("start transaction", $objMySQLConID);
 mysql_query("begin", $objMySQLConID);
 mysql_query(SQLなどの実行, $objMySQLConID);
 //コミットする場合
 mysql_query("commit", $objMySQLConID);
 //ロールバックの場合
 mysql_query("rollback", $objMySQLConID);
 mysql_close($objMySQLConID);
となります。

色々な例をみていると、【mysql_query】の2番目の引数【$objMySQLConID】がないものもあります。
PHPのマニュアルをみると、なくてもいいとなってます。
ですが、どうにもないと気持ち悪くて仕方ないので、つけておきます。