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); }
なんでモデルにメソッドが無いんだろう?