Transactions - Further comments
The eval { … } catches all exceptions
- not just from DBI calls. Also catches fatal runtime errors from Perl
Put commit() inside the eval
- ensures commit failure is caught cleanly
- remember that commit itself may fail for many reasons
Don't forget that rollback() may also fail
- due to database crash or network failure etc.
- so you'll probably want to use eval { $dbh->rollback };
Other points:
- Always explicitly commit or rollback before disconnect
- Destroying a connected $dbh should always rollback
- END blocks can catch exit-without-disconnect to rollback and disconnect cleanly
- You can use ($dbh && $dbh->{Active}) to check if still connected