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日間、ずっとトランザクション関係をやっていた気がする。