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を立てて置かないとセグメンテーションフォルトで落ちちゃう。