DBIx::Roles::Transaction - allow nested transactions.


DBIx-Roles documentation  | view source Contained in the DBIx-Roles distribution.

Index


NAME

Top

DBIx::Roles::Transaction - allow nested transactions.

DESCRIPTION

Top

Wraps begin_work, rollback, and commit calls so that these can be called inside transactions. If an inner transaction calls rollback, all outer transactions fail. The original idea appeared in DBIx::Transactions by Tyler MacDonald.

SYNOPSIS

Top

     use DBIx::Roles qw(Transaction);

     my $dbh = DBI-> connect(
           "dbi:Pg:dbname=template1",
	   "postgres",
	   "password",
     );
     sub do_something {
         my($dbh, $num) = @_;
         $dbh->begin_work;
         if($dbh->do("DO SOMETHING IN SQL WHERE num = $num")) {
            $dbh->commit;
         } else {
            $dbh->rollback;
         }
      }

      $dbh->begin_work;
      for my $i (1 .. 10) {
         do_something($dbh, $i);
      }

      if( $dbh->commit) {
         print "Every nested transaction worked and the database has been saved.\n";
      } else {
         print "A nested transaction rolled back, so nothing happened.\n";
      }

NOTES

Top

The role is useful, if you planning a library where methods are required to be transactions, but also might be called from within a transaction. For example, a method changing user password can be implemented as a transaction, but also can be called from the method that adds user data, which is in turn can be a transaction too.

The role has nothing to do with the real nested transactions, that might be implemented by a particular database engine, such as for example savepoints in PosgtreSQL.

SEE ALSO

Top

DBI, DBIx::Roles, DBIx::Transaction.

COPYRIGHT

Top

AUTHOR

Top

Dmitry Karasik <dk@catpipe.net>


DBIx-Roles documentation  | view source Contained in the DBIx-Roles distribution.