Friday, February 1, 2013

Perlでのトランザクション

DBIを使用した場合のトランザクションはこんな感じ?
%attr = (RaiseError=>1, PrintError=>0);    # AutoCommit=1 (default)
$dbh = DBI->connect($dsn, $user, $pass, \%attr);
eval {
    $dbh->begin_work;    # begin tran
    $sth = $dbh->prepare($statement);
    $sth->bind_param($p_num, $bind_value);
    $sth->execute;
    $dbh->commit;    # commit tran
};
if ($@) {    # eval内でエラーが発生するとここへ
    warn "Transaction aborted because $@";
    $dbh->rollback;    # rollback tran
}
$dbh->disconnect;

AutoCommit=1の場合は明示的にbegin_workでトランザクションを開始する
AutoCommit=0の場合は
$dbh->{AutoCommit} = 0;
したタイミングで開始される?
明示的に指定したいのでそのまま(AutoCommit=1)で

RaiseError=1だとDBerrorの際にdieを発生させる
RaiseError=0だといちいち
$sth->bind_param($p_num, $bind_value) or die("sql bind error $!");
とする必要がある
die書くのが面倒なので(RaiseError =1)で

PrintError=1だとDBerror時にエラーメッセージを表示させる
RaiseError=1の場合、dieのメッセージを表示すると
同じものが表示されて鬱陶しいので(PrintError=0)


参考

No comments:

Post a Comment