%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