Florian Weimer wrote:
Is there are ready-to-use transaction wrapper for DBD:Pg? I'm looking
for somehting which can be used like this:
Oh, absolutely there is.
See http://search.cpan.org/dist/DBIx-Connector/ which David Wheeler put out a
few years ago. See the txn() method.
Besides doing exactly what you want (it also does the begin_work/commit for
you), DBIx::Connector also makes it easier to write things that behave correctly
in different contexts such as persisting DBI connections in Apache versus
non-persisting ones in scripts. And it is DBMS-portable.
The module takes care of just a small number of things that are tricky to get
right and that most people don't want to have to do themselves, and it otherwise
stays out of your way.
-- Darren Duncan
my $connect_args = [$data_source, $username, $auth, \%attr];
transact $connect_args, sub {
my ($dbh) = @_;
$dbh->begin_work;
...
$dbh->commit;
};
The transact subroutine should abort the transaction if the passed sub
dies. For certain exceptions, the sub should be called again to retry
the transaction. The database handle should be cached.
This is somewhat PostgreSQL-specific because there are three cases:
permanent errors (such as SQL syntax errors, or non-SQL exceptions),
transient errors which will go away when the transaction is retried
within the same connection (such as serialization failures and certain
types of UNIQUE constraint violations), and errors which will likely go
away when the transaction is retried with a fresh connection (due to
server restart, for example).
This is not very difficult to write as such, but getting the error code
list right is a bit delicate.