sub do_transaction { my ($code) = @_; &transactions_on; eval { $code->() }; &rollback_and_die if $@; &commit; &transactions_off; } sub rollback_and_die { my $commit_error = $@; # save it as rollback could fail eval { $_->rollback foreach (AllTables::handles); }; &transactions_off; # just to be safe die $commit_error; # and fatal death } sub commit { eval { $_->commit foreach (AllTables::handles); }; &rollback_and_die if $@; # commit failed, so bail } sub transactions_on { $_->{AutoCommit} = 0 foreach (AllTables::handles); } sub transactions_off { $_->{AutoCommit} = 1 foreach (AllTables::handles); }