{ local $dbh->{AutoCommit} = 0; # enable transactions, if possible local $dbh->{RaiseError} = 1; local $@; eval { foo(...) # do lots of work here bar(...) # including inserts baz(...) # and updates $dbh->commit; # commit the changes if we get this far }; if ($@) { warn "Transaction aborted because $@"; eval { $dbh->rollback }; } } # Note, RaiseError and AutoCommit now revert to previous state.