| KiokuDB documentation | Contained in the KiokuDB distribution. |
KiokuDB::Backend::Role::TXN - Backend level transaction support.
package MyBackend;
use Moose;
with qw(
KiokuDB::Backend
KiokuDB::Backend::Role::TXN
);
sub txn_begin { ... }
sub txn_commit { ... }
sub txn_rollback { ... }
This API is inspired by standard database transactions much like you get with DBI.
This is the low level interface required by txn_do in KiokuDB.
This method should evaluate the code reference in the context of a transaction,
inside an eval. If any errors are caught the transaction should be aborted,
otherwise it should be committed. This is much like
txn_do in DBIx::Class::Schema.
The rollback callback should be fired when the transaction will be aborted.
Begin a new transaction.
This method can return a transaction handle that will later be passed to
txn_commit or txn_rollback as necessary.
The current handle will be passed to nested calls to txn_begin.
Commit the transaction.
Rollback the transaction.
| KiokuDB documentation | Contained in the KiokuDB distribution. |
#!/usr/bin/perl package KiokuDB::Backend::Role::TXN; use Moose::Role; use Carp qw(croak); use Try::Tiny; use namespace::clean -except => 'meta'; requires qw(txn_begin txn_commit txn_rollback); sub txn_do { my ( $self, $coderef, %args ) = @_; my @args = @{ $args{args} || [] }; my ( $commit, $rollback ) = @args{qw(commit rollback)}; ref $coderef eq 'CODE' or croak '$coderef must be a CODE reference'; my @txn_args = $self->txn_begin; try { my @ret; if ( wantarray ) { @ret = $coderef->(@args); } elsif ( defined wantarray ) { $ret[0] = $coderef->(@args); } else { $coderef->(@args); } $commit->() if $commit; $self->txn_commit(@txn_args); return wantarray ? @ret : $ret[0]; } catch { my $err = $_; try { $self->txn_rollback(@txn_args); $rollback->() if $rollback; } catch { croak "Transaction aborted: $err, rollback failed: $_"; }; die $err; } } __PACKAGE__ __END__