注: RaiseError は false に設定されます。
$dbh->begin_work;
$dbh->do("..."); # sql1, ok
$dbh->do("..."); # sql2, fails (e.g. syntax error)
$dbh->do("..."); # sql3, ok
$dbh->commit;
これにより、sql1 と sql3 の効果がコミットされますが、これは望ましくありません。この場合、SQL ステートメントを一緒に成功/失敗させたいからです。現在、私の回避策は次のとおりです。
eval {
local $dbh->{RaiseError} = 1;
$dbh->begin_work;
$dbh->do("..."); # sql1, ok
$dbh->do("..."); # sql2, fails (e.g. syntax error)
$dbh->do("..."); # sql3, ok
$dbh->commit;
};
$dbh->rollback if $@; # needed, RaiseError does not automatically rollback
しかし、私はそれがあまり好きではありません。もっと簡単な代替手段はありますか?私はPostgresの動作を好みます:
$dbh->begin_work;
$dbh->do("..."); # sql1, ok
$dbh->do("..."); # sql2, fails (e.g. syntax error)
$dbh->do("..."); # sql3, ok but fail because transaction status is now aborted
$dbh->commit; # becomes rollback