[Catalyst] CDBI transactions

Brian Cooke mrkoffee at saltedsnail.com
Wed Jun 15 10:14:36 CEST 2005


I have a subroutine I've been using for a while to accomplish commit/ 
rollback in small scopes.  Since I haven't seen a plugin around for  
that, I thought I'd take the extra step of adapting it as a Catalyst  
plugin for those using CDBI-based models.  I've done this, and the  
plugin does seem to work as desired.  A few questions, though:

I seem to remember some talk--I think it was on the #catalyst daily  
summaries--of a plugin for transactions.  Is there a plugin or  
similar functionality I'm not seeing elsewhere?  Has someone already  
done the work on this?  I don't want to step on anyone's toes.

The code is pretty straightforward.  It's taken almost directly from  
the Class::DBI documentation (under TRANSACTIONS).  I'm especially  
interested in how best to identify the CDBI component, in order to  
localize AutoCommit and to call dbi_rollback.  Currently I'm just  
searching for components containing "CDBI" (they all share a common  
db_Main, right?), but that depends on the Model component having  
"CDBI" in its name.  Here it is:

sub transaction {
     my ( $c, $coderef ) = @_;
     my $cdbi = $c->component('CDBI');
     die "Couldn't find a CDBI component" unless defined $cdbi;

     # Turn off AutoCommit for this scope
     local $cdbi->db_Main->{AutoCommit};

     # Execute the code in $coderef and roll back upon error
     eval { $coderef->() };
     if ( my $error = $@ ) {
         eval { $cdbi->dbi_rollback };  # rollback might die too
         $c->error($error);
         return 0;
     }
     return 1;
}

This would be called from within an action like this:

$c->transaction ( sub {
     # Some statements that should be executed atomically
} ) or $c->log->error("Transaction failed: " . $c->error->[-1]);


Thoughts and suggestions welcome!

Brian



More information about the Catalyst mailing list