読者です 読者をやめる 読者になる 読者になる

元フリーエンジニアライフ

Ruby on Rails とか MovableType とかAWSやってるフリーランスウェブエンジニアの記録でした。現在は法人成りしてIT社長。

MT::Object でのトランザクション(Rollback / Commit)

挙動が思ってたのと違ったのでメモ。

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を使っている場合、テーブルがトランザクションをサポートしたエンジンになってないとだめです。

※注意 remove() はこれではロールバックできません!

MT::Object::remove() でトランザクションが効かない件について - フリーエンジニアライフ