%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