ShcemaベースになってからえらいことになってるDBIx::Classです。
Catalyst::Model::DBICもまだDBIx::Class::Schema::Loader対応になってないのでCatalyst::Model::DBIC::Plainを使ってたりします。
で、DBIx::Class::Manual::Cookbookにも書いてありますが、C::M::DBIC::Plainでトランザクションを管理する場合は
eval {
$c->model('DBIC')->storage->txn_begin;
$c->model('DBIC::Entry')->create({
title => $c->request->parameters->{title},
body => $c->request->parameters->{body},
});
$c->model('DBIC')->storage->txn_commit;
};
if ($@) {
$c->error("Rollback: $@");
eval {$c->model('DBIC')->storage->txn_rollback};
}
こんな感じでよさげです。
もちろんMySQLならInnoDBを使ってApp::M::DBICでRaiseErrr => 1, AutoCommit => 0をしておく必要があります。

コメントする