タケユー・ウェブ日報

Ruby on Rails や Flutter といったWeb・モバイルアプリ技術を武器にお客様のビジネス立ち上げを支援する、タケユー・ウェブ株式会社の技術ブログです。

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() でトランザクションが効かない件について - フリーエンジニアライフ