だいこんの日々2

軸足をtwitterとfacebookに移しつつも、技術的な話はここに書いていきます。

S2Dao.php5でトランザクション

今日は、S2Dao.php5(とS2Ethna)でトランザクションに四苦八苦。

公式の「PDOトランザクションの自動制御」を読みながら作って、とりあえず正常系は動いた。(ように見えていた。)

異常系として、トランザクション中断によるrollbackを確認するために例外を投げてみると、rollbackしない!
それどころか、INSERT3件中2件目の後に例外を投げているので、2件目までがcommitされている…。
なんでじゃー!

S2Dao.php5のソースを追いかける。コード上ではきちんとrollbackが呼ばれている。設定ファイルを見直し。PDO::ATTR_AUTOCOMMITはfalseになってる。うーん、わからん。

で、MySQLを疑ってみた。

MyISAMだとトランザクションが効かん!忘れてた!
エンジンをInnoDBかBDBにしないと。

ってことで、DBの作り直し。
…ん?InnoDB指定しているのにMyISAMにしかならないぞ?
phpMyAdminが悪いのかと思って、コマンドラインからやってみても変化なし。
またまたなんでじゃー!

コマンドラインでいろいろ調べていると、

mysql> show innodb status;
ERROR 1235 (42000): Cannot call SHOW INNODB STATUS because skip-innodb is defined

がーん。MySQLの設定ファイルにskip-innodbがあった…。

ってことで、無事にDB作り直して、トランザクションも効くようになったとさ。
(⌒〜⌒ι) とほほ。