2012-10-14 2 views
1

이 질문은 Perl DBI (MySQL과 함께 사용)에 관한 것입니다. 예상대로AutoCommit과 begin_work/rollback을 동일하게 설정합니까?

{ 
    local $dbh->{AutoCommit} = 0; 
    ... 
    if(...) { 
    $dbh->rollback; 
    } 
    ... 
}

가 작동됩니다

나는 다음과 같은 코드를 원하는? (나는 롤백 후 과도한 커밋을 의미하지 않는다) $ dbh -> {AutoCommit}은 $ dbh-> begin_work 및 $ dbh-> rollback과 호환 가능합니까?

답변

2

네, 그렇게 할 수는 있지만 원하는 이유는 무엇입니까? begin_work를 호출 한 다음 커밋하거나 롤백하지 않는 것이 좋습니다. AutoCommit이 켜져 있어도 제대로 작동합니다.

use strict; 
use warnings; 
use DBI; 
use Data::Dumper; 

my $h = DBI->connect(); 
eval { 
    $h->do(q/drop table mje/); 
}; 
$h->do(q/create table mje (a int)/); 
my $s = $h->prepare(q/insert into mje values(?)/); 

foreach my $it(1..2) { 
    { 
     local $h->{AutoCommit} = 0; 

     $s->execute($it); 

     if ($it == 2) { 
      $h->rollback; 
     } else { 
      $h->commit; 
     } 
    } 
} 

my $r = $h->selectall_arrayref(q/select * from mje/); 
print Dumper($r); 

outputs: 

$VAR1 = [ 
      [ 
      1 
      ] 
     ]; 

하지만 다음은 나에게 더 나은 같습니다

foreach my $it(1..2) { 
    $h->begin_work; 

    $s->execute($it); 

    if ($it == 2) { 
     $h->rollback; 
    } else { 
     $h->commit; 
    } 
} 
관련 문제