[Dbix-class] 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 22:44:13 GMT 2009


hi, everyone, 

 I finally looked at the updated doc for txn_do and transactions have
been implemented correctly in my application.

Nevertheless, I do have a few questions (at the bottom). 





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? 


 thank you :)


k. akimoto



More information about the DBIx-Class mailing list