[Catalyst] how to implement Transactions (over different db tables) in a Catalyst project

kakimoto at tpg.com.au kakimoto at tpg.com.au
Mon Jul 6 09:21:41 GMT 2009


hello there, Tomas,

 Thank you :) 

 Yes, you're quite right there:)
Prior to receiving this reply, I actually wrapped my existing code in
the subroutine  within an sub for the  txn_do.

sub save_complete_records
{
  ...

  eval
  {
      $c->model('myAppDB')->schema->txn_do( sub 
          {
            ...
           $c->forward(
                    '/subscriptions/_save_address',
                    [   
                        { 'policy_id' => $policy_id, }
                    ]
           );

           ...
  }
   if ($@)
   {
        $c->log->debug(' Exception manually trapped here : ' . $@ );
        $c->model('myAppDB')->schema->txn_rollback or die "Cannot ROLL
BACK - Address module";
        $c->log->debug(' manually rolled back' );
        $c->error(
            q{ An error has occured with the listing. If this problem } .
            q{persists please contact our helpdesk at
helpdesk at insuranceline.}.
            q{com.nz.}
        );
   }
}


To test, I purposedly entered a very long string for one of the database
attributes to make the transaction
fail.

I have the following questions:
1) I looked at the terminal with all the debug messages. I noticed that
the exception was caught and eventhough the roll back was done, I do not
see the print outs from the liens within the "if ($@)" (exception
handling) section above. Why is that?

2) I noticed that whilst the rollback was successful. the sequence do
not get rolled back.
IS this desired behaviour of DBIx::Class?

 To illustrate,  before the exception was caught, an entry was made in
my User_Subscriptions database table. The ID was printed out and I took
note of it.
When the operation was complete, I queried my User_Subscriptions
database table (using psql for postgresql for an entry of the noted ID).
No entry of the noted ID was returned.
I went back to the webpage and entered the form with valid attributes
and yes, all 
necessary objects were created in the database backend and the sequence
in the User_Subscriptions database table had increased by 1.

Any ideas, Tomas and everyone? :)


 thank you :)


k. akimoto



On Mon, Jul 6th, 2009 at 6:18 PM, Tomas Doran <bobtfish at bobtfish.net> wrote:

> This is fairly easy to get wrong - txn_do forces you to have a block 
> 
> which comprises the transaction scope, or your code won't compile.
> 
> It will start a transaction at the start of the block, and commit it 
> 
> at the end if an exception hasn't been encountered during the  
> transaction
> 



More information about the Catalyst mailing list