Откат Perl DBI не работает - PullRequest
       11

Откат Perl DBI не работает

2 голосов
/ 10 сентября 2010

Я использую этот подход.Если в sql есть ошибка, откат происходит только для первого идентификатора группы активов.Остальные идентификаторы игнорируются.Я делаю это правильно?

my $sql = "sql batch that update and insert depending on the condition";  
$dbh->{RaiseError} = 1;  
$dbh->{PrintError} = 0;  
$dbh->{AutoCommit} = 0;  

my $sth = $dbh->prepare($sql);  
my @error = ();  
my $num = 0;  
foreach my $id (@asset_group) {  
 next if ($id eq '');  
 eval {  
  $sth->bind_param(1, $id);  
  $sth->bind_param(2, $vars{'other_id'});  
  $sth->execute();  

 };  
 if ($@) {  
  $dbh->rollback();  
  push @error, $@  
 } else {  
  $dbh->commit();  
 }  
}

1 Ответ

7 голосов
/ 10 сентября 2010

В зависимости от базы данных, вам может потребоваться начать работу , прежде чем начать что-то менять. Кажется, я помню, что Informix требовал его.

Кроме того, похоже, что вы выполняете коммит или откат после каждого выполнения. Как только вы сделаете коммит, вы не сможете откатиться. Обычно говорят что-то вроде

$dbh->begin_work;
eval {
    for my $id (@asset_group) {  
        next if ($id eq '');  
        $sth->execute($id, $vars{other_id});  
    }
    1; #if it doesn't die then this will force it to return true
} or do {
    my $error = DBI->errstr;
    $dbh->rollback();
    die "could not insert rows: $error\n"
};
$dbh->commit();

Обратите внимание, как я не использую $@. $@ является ненадежным .

...