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のマニュアルをみると、なくてもいいとなってます。
ですが、どうにもないと気持ち悪くて仕方ないので、つけておきます。
2012年02月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29
先月
来月
カテゴリ
検索
関連サイト
プロフィール
【ネットネーム】
みゅー

キャラクター by ツカエルサイト


【趣味】
・プログラミング
・写真
・楽器演奏
・手芸
・日曜大工
・家の中の不便を便利に
・考える
・自然科学
・猫と戯れる
・ジグソーパズル

【仕事】
・派遣社員でSE・PGやっていました。次の良い仕事がみつからないので、ビジネスへ注力しようと思っています。
・経験言語:VB6、VB.NET、PHP、Perl、JAVA、Oracle、SQLServer、PostgreSQL



【名前】
アン(足)

2014年4月22日生まれ 女の子
あだ名は くノ一
普段は普通にしゃべりますが、興奮すると『ニャ』を連発します

【趣味】
・狩
・ご飯を食べる
・ママのお手伝い

【仕事】
ママのビジネスの看板招き猫
ママの代わりにPC入力
仕事中のママの右腕を温める
ママに心配をかける
いろんな事をしでかしてママを退屈させない

RSSフィード
Tweet