CakePHP 1.2 でトランザクション

モデルでbegin()とかやってはいけない気がする。


Overloadableを継承してるので、メソッドが定義されていない場合は
call__()がコールされる。
ベヘイビアとか登録してたらそっちが呼ばれるけど、通常は使わないと思うので
データソースのquery()が呼ばれる。

query()内では、メソッドをテンプレートとして引数をバインドしてSQLとして呼ぶと思うので、
begin()とかやると、"BEGIN"というSQLがコールされる。
PostgreSQLだとまさにこれはトランザクション開始のコマンドなので
動作してるように見えると思われる。


でもね。データソースにはちゃんと

  • begin()
  • commit()
  • rollback()

っていうメソッドがあるからこっちを使うはず。
モデルのsaveAll()内でもそうしてる。


ということで、モデルにメソッドがないのが困ったけど、以下で解決。
AppModelに以下を追加するだけ。

    function begin()
    {
        $db =& ConnectionManager::getDataSource($this->useDbConfig);
        $db->begin($this);
    }
    
    function commit()
    {
        $db =& ConnectionManager::getDataSource($this->useDbConfig);
        $db->commit($this);
    }
    
    function rollback()
    {
        $db =& ConnectionManager::getDataSource($this->useDbConfig);
        $db->rollback($this);
    }

なんでモデルにメソッドが無いんだろう?