だいこんの日々2

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

S2Dao.php5でトランザクション(2)

昨日トランザクションが効くようになったのだが、その裏で大変なことに。

参照系(SELECT)はトランザクションに関係なく動作するのだけれど、更新系(INSERT/UPDATE/DELETE)はトランザクションを起こさないと更新できなくなってしまった。まぁ、PDO::ATTR_AUTOCOMMITがfalseだから当たり前と言えば当たり前なんだけど、MyISAMトランザクションに関係なく更新できたので。

ってことで、更新系の部分をトランザクション起こすべく書き換え。最初は単独でトランザクションマネージャを書いて、AppManagerから呼び出した。無事にトランザクションも起きた。しかし、クラスが多くなって非常に煩雑に。

ActionClass
   -> AppManager
     -> DAO(参照系)
     -> TxManager -> DAO(更新系)

見通しが悪くなったので、トランザクションマネージャをAppManager側に統合。

…したのだが、今度はトランザクションが起きなくなった!?
DAOにアクセスしているメソッドをpointcutに指定したのだがトランザクション起きず。なんでだ?
pointcutを「.*」にするとトランザクションが起きることを確認。でもDBにアクセスしないメソッドでもトランザクションを起こすので、これはまずい。

だいぶ悩んだあげく、そのメソッドが同一クラス内から呼ばれていることに気づいた。S2Container.PHP5の実装だと、同一クラス内からの呼び出しにはAOPできないのだ。AOPの対象メソッドを変更したら無事にトランザクションが起きた。

いやはや。この2日間、ずっとトランザクション関係をやっていた気がする。