Ok, now I understand where is my mistake.
I set $dbh->{RaiseError} = 1 after declaring the statements $sql_live
and $sql_dwh so these have the original value of RaiseError. In this
case I have to modify the property of the single statements.

Thanks,
PL

On Sep 20, 7:11 pm, imhar...@nuskin.com (Ian Harisay) wrote:
> I think you would be better off to write it like this.
>
> $dbh->{RaiseError} = 0;
> $dbh->{PrintError} = 0;
> $dbh->{AutoCommit} = 0;
>
> my @record = ($row_id, $file_id, $offset, $country, $date_day, $campaign, 
> $leaf_id, $status_id);
>
> my $rv;
> SWITCH: {
>   last unless($rv = $sql_live->execute(@record));
>   last unless($rv = $sql_dwh->execute(@record));
>
> };
>
> if($rv){
>   $dbh->commit();}
>
> else{
>   warn "Transaction failed, rolling back. Error was:\n $dbh->errstr\n";
>   $dbh->rollback();
>
>
>
> }
> -----Original Message-----
> From: Paolo Lunazzi [mailto:pluna...@gmail.com]
> Sent: Monday, September 20, 2010 3:25 AM
> To: dbi-us...@perl.org
> Subject: dbi transactions error handling
>
> Hi all,
>
> I'm working on a script that should manage transactions.  My code is
> something like this:
>
> --- CODE ---
>
> $dbh->{RaiseError} = 1;
> $dbh->{PrintError} = 0;
> $dbh->{AutoCommit} = 0;
> eval {
>             $sql_live->execute(
>                 $row_id,     $file_id, $offset, $country,  $date_day,
>                 $campaign, $leaf_id,   $status_id
>             );
>             $sql_dwh->execute(
>                 $row_id,     $file_id, $offset, $country,  $date_day,
>                 $campaign, $leaf_id,   $status_id
>             );
>             $dbh->commit();
> };
>
> if ($@) {
>             warn "Transaction failed, rolling back. Error was:\...@\n";
>             eval { $dbh->rollback ( ); };
> }
> $dbh->{AutoCommit} = 1;
> $dbh->{PrintError} = 1;
> $dbh->{RaiseError} = 0;
>
> --- CODE ----
>
> Testing the script I noticed that errors on the execute are not
> catched by eval and $@ is not set. For example duplicate key errors
> and calls with a wrong number of bind variables are printed on the
> screen (event with PrintError = 0) and the transaction is not
> rollbacked. If I do the same statment with a $dbh->do() the
> transaction fails and do the rollback correctly.
> Note that $sql_dwh and $sql_live are prepared using $dbh handle.
> With some debug I can see that DBD::mysql::st execute fails are not
> catched by eval while DBD::mysql::db do fails are handled correctly.
> Am I doing something wrong or this behaviour is correct?
>
> TIA,
> PL

Reply via email to