KiokuDB::Backend::Role::TXN - Backend level transaction support.


KiokuDB documentation Contained in the KiokuDB distribution.

Index


Code Index:

NAME

Top

KiokuDB::Backend::Role::TXN - Backend level transaction support.

SYNOPSIS

Top

    package MyBackend;
    use Moose;

    with qw(
        KiokuDB::Backend
        KiokuDB::Backend::Role::TXN
    );

    sub txn_begin { ... }
    sub txn_commit { ... }
    sub txn_rollback { ... }

DESCRIPTION

Top

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.

OPTIONAL METHODS

Top

txn_do $code, %callbacks

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.

REQUIRED METHODS

Top

txn_begin [ $parent_txn ]

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.

txn_commit $txn

Commit the transaction.

txn_rollback $txn

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__