とほほのN88-BASIC日記 このページをアンテナに追加 RSSフィード

2008-08-06

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;
}

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

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

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

tokuhiromtokuhirom 2008/08/07 10:53 reuse_dbh を有効にしないと、クエリうつたびに connection はる仕様だった気がします。
そして、DBD::SQLite は、コネクションはりまくってリソースをリークすると SEGV します。

hide-Khide-K 2008/08/07 11:03 なるほど。ただ、begin_workを呼んだときだけの挙動なので、この辺を追っかける必要ありそうですね。

tokuhiromtokuhirom 2011/08/09 18:33 最近のDBD::SQLiteではSEGVしなくなっています。
(たまたまググってたらひっかかったので、現在では通用しない情報にたいするフォローコメントです)

hide-Khide-K 2011/08/09 18:52 tokuhirom++

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証