2009-12-30 1 views
2

데이터 무결성을 보장하기 위해 현재 내 DBI 드라이버 클래스가 트랜잭션에있는 경우에만 실행되어야하는 몇 가지 메소드가 있습니다. 나는 이런 식으로 뭔가 쓰고 찾고 있어요 : begin_work에 대한DBI 드라이버 상태가 트랜잭션 내에 있는지 어떻게 테스트 할 수 있습니까?

sub m{ 
    my ($self , $dbh) = @_ ; 
    unless($dbh->isInTransaction()){ 
    die "Use this only within a transaction\n" ; 
    } 
    etc ... 
} 

워드 프로세서를, 내가 begin_work가 오프 트랜잭션의 시간 동안 AutoCommit을 설정할 것을 이해에 커밋 '에'다시로 설정됩니다 또는 롤백하지만 AutoCommit 속성 값을 테스트하면 isInTransaction을 구현하는 안전한 방법인지 궁금합니다.

도움 주셔서 감사합니다.

답변

7

는 dbh-> begin_work, 당신은 당신이 거래에있어 있는지 확인하기 위해 테스트 할 수 있습니다 : 당신은 단지 데이터베이스 핸들에 연결된 활성 제표를 확인할 수 있습니다 트랜잭션 활동이 있다면

if ($dbh->{ActiveKids}) { 

나는 확인했다 적이 - 그것은에 대한 지원은 없다 나를 놀라게한다. DBI에 대한 래퍼 (또는 DBI에 메소드 삽입)에서 트랜잭션을 직접 추적해야합니다. BegunWork를 AutoCommit이 비활성화 된 상태로 확장하면 핵심 DBI 수정처럼 보입니다.

+0

이 'BegunWork'는 내가 필요한 것입니다 (예, AutoCommit을 사용합니다). 그래도 DBI 문서에서 찾을 수 없습니다. 문서화되지 않은 기능입니까? – jeje

+0

네, 문서화되지 않았습니다. 그래서 나는 아무런 지원이 없다는 것에 놀랐습니다. 제공하는 것은 아주 간단한 것처럼 보입니다. –

0

코드 데이터베이스에 독립적입니까? 트랜잭션을 처리하는 방법에 따라 데이터베이스간에 몇 가지 중요한 차이점이 있기 때문에 AutoCommit 섹션을주의 깊게 읽으십시오. 그러나 데이터베이스가 필요한 방식으로 트랜잭션을 처리한다는 것을 이미 알고 있다면 AutoCommit이 좋을 것입니다. 당신은 자동 커밋을 사용하지 않도록 설정하면

if ($dbh->{BegunWork}) { 

는, DBI가 많은 도움이되지 않습니다 : 당신은 자동 커밋을 활성화하고 $로 거래를 시작하면

+0

예, 데이타베이스에 독립적입니다. 다음과 같이 유지하고 싶습니다. – jeje

+0

나는 그 단어를 조금 부주의하게 사용했습니다. 내가 말한 의미는 코드가 실행될 데이터베이스의 종류를 아십니까? – Dan

+0

그래, postgresql. – jeje

1

독자적인 래퍼 클래스를 작성하는 경우 자신의 상태를 유지할 수 있도록 begin_work 및 다른 트랜잭션 메소드를 래핑 할 수 있습니다. 그렇지 않으면 문서화되지 않은 기능이나 변경 될 수있는 가정에 의존합니다. 특히 다른 드라이버로 전환해야하는 경우에 특히 그렇습니다.

관련 문제