挙動が思ってたのと違ったのでメモ。
- Movable Type 6
- MySQL 5.1 InnoDB
my $entry = MT->model( 'entry' )->load(); $entry->begin_work; # トランザクション開始…とおもいきや実はまだフラグを立てるだけ $entry->save(); # ここでトランザクション開始(auto_commit=0) & UPDATE ... $entry->rollback(); # Rollback(rollback & auto_commit=1)
なぜそうなるかは extlib/Data/ObjectDriver/BaseObject.pm 参照
実際に使う場合はevalなどを組み合わせることになると思います。
my $entry = MT->model( 'entry' )->load(); $entry->begin_work; eval { $entry->save(); # その他いろんな処理 }; if ( my $errstr = $@ ) { $entry->rollback(); } else { $entry->commit(); }
当然ですが、MySQLを使っている場合、テーブルがトランザクションをサポートしたエンジンになってないとだめです。