Data::ObjectDriverでトランザクション

CPANに上がってるのだとどーやったらいいのかさっぱりわかんなかったけど、code.sixapart.comに上がってるやつだとこんな感じでやるみたい。

Data::ObjectDriver::BaseObject->begin_work;

eval {
    my $album = Album->new;
    $album->title('Album');
    $album->artist('Artist');
    $album->save;

    for ( 1 .. 5 ) {
        my $track = Track->new;
        $track->title("Track $_");
        $track->artist("Artist $_");
        $track->album_id($album->id);
        $track->save;
    }
};
if ($@) {
    Data::ObjectDriver::BaseObject->rollback;
    die $@;
} else {
    Data::ObjectDriver::BaseObject->commit;
}

innodbmysqlはこれで確認したけどSQLiteだともう一工夫が必要みたい。

Data::ObjectDriver::Driver::DBI->new(
    dsn       => 'dbi:SQLite:db.db',
    reuse_dbh => 1,
);

reuse_dbhを立てて置かないとセグメンテーションフォルトで落ちちゃう。