注意: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