2014-05-25 4 views
6

PHP PDO::commit() 설명서에 성공하면 메서드가 TRUE를 반환하고 실패하면 FALSE가 반환됩니다. 이것은 beginTransaction()과 commit() 사이의 명령문 실행 성공 또는 실패를 참조합니까? 문서에서 예를 들어PDO :: commit() 성공 또는 실패

:

$dbh->beginTransaction(); 
$sql = 'INSERT INTO fruit (name, colour, calories) VALUES (?, ?, ?)'; 
$sth = $dbh->prepare($sql); 

foreach ($fruits as $fruit) { 
    $sth->execute([ 
     $fruit->name, 
     $fruit->colour, 
     $fruit->calories, 
    ]); 
} 

$dbh->commit(); 

위의 실행 중 하나가 실패하면() 메소드를 커밋합니다 인해 원자 트랜잭션의 "전부 아니면 아무것도 기준"에 false를 반환?

$dbh->beginTransaction(); 

try { 
    // insert/update query 

    $dbh->commit(); 
} catch (Exception $e) { 
    $dbh->rollBack(); 
} 

을 항상 매력으로 일 :

+0

나는 코드베이스 내에서 커밋 할 필요가 없다는 것을 상기 해 본적이 없다. – Jonast92

+0

이해할 수 있는지 잘 모르겠습니다.수동 트랜잭션의 요점은 여러 명령문이 모두 성공했는지 또는 모두 실패했는지 확인하는 것입니다. –

+0

나는 당신이 그것을 과장 생각한다고 생각합니다. 이 시나리오에서 하나가 실패하면 대부분이 실패하고 그 반대의 경우도 마찬가지입니다. 코드에 적절한 오류 처리를 추가하기 만하면 무엇이 실패했는지에 대해 정말로 염려하면 단순히 기록하십시오. 나는 서버 측 코드에서 커밋을 사용하지 않아도된다. 나는 당신이 그렇게 할 것 같지 않다. – Jonast92

답변

2

반환 값은 커밋하려는 트랜잭션이 아닌 pdo :: commit 자체를 기반으로합니다. 트랜잭션이 활성화되어 있지 않으면 FALSE를 반환하지만 TRUE 또는 FALSE를 반환 할 때마다 명확하지는 않습니다.

트랜잭션 내에서 실행 된 쿼리는 자체적으로 성공하거나 실패합니다. Mr.Tk의 예제를 사용하면 가능한 경우 트랜잭션이 커밋되고 "try"블록에서 쿼리를 실행하는 동안 오류가 발생하지 않고 "try"블록에서 오류가 발생하면 롤백됩니다.

"try"블록 내에서 실행 된 쿼리 만 평가할 때는 개인적으로 일반적인 예외 대신 PDOException을 catch하려고합니다.

$dbh->beginTransaction(); 
try { 
    // insert/update query 
    $dbh->commit(); 
} catch (PDOException $e) { 
    $dbh->rollBack(); 
} 
0

난 항상 그런 식으로 일을했습니다! :)

그래서 내가 생각하기에 삽입이 실패하면 응용 프로그램이 예외를 throw하고 커밋이 실행되지 않을 것입니다.

3

핵심 부분 만 롤백이 불필요 할 시도 - 캐치를하면서, 예외 모드에서을 PDO를 설정하는 입니다. 따라서, 여러분의 코드가 모든 권리, 당신이 원하는 모든 실패에 대한 롤백 경우 같은 당신이 어딘가에이 줄을 가지고, 그것을 변경할 필요가 있습니다 :

스크립트가 종료됩니다 실패의 경우
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

, 연결이 종료 mysql이 트랜잭션을 롤백하게된다.

수동으로 롤백하려는 경우에는 다른 대답 에서처럼 롤백을 제대로 수행하지 않아야합니다. 확인

  • 당신은 특정 예외가 당신이 재 던지는 예외 롤백 후를, 문제를 통보받을 수 있습니다 실행
  • 을 중단 중요하지 않는 Exception하지 PDOException을 잡는 것을
  • 테이블 엔진이 트랜잭션을 지원한다는 것도 의미합니다 (예 : MyISql의 경우 MyISAM이 아닌 InnoDB 여야 함).

이 체크리스트는 my article에서 가져온 것입니다.이 체크리스트는이 측면이나 다른 많은 측면에서 유용 할 수 있습니다.

+0

정말 이것에 대해 확신합니까? 10 개의 다른 삽입 또는 업데이트를 수행하고 마지막 한 pdo에서 예외가 발생하면 9 개의 다른 문장이 모두 롤백됩니까? –

+0

@CarlosGoce에 동의합니다. 명시 적'begin/rollback' 처리 없이는 롤백되지 않습니다. 그러나 예외는 @ Mr.TK가 말한대로 '롤백'을 실행하는 데 도움이됩니다. 실제로'commit'에 대한 질문에 대답조차하지 않습니다. 트랜잭션이 잘못되어 이전에 전송 된 많은 쿼리를 취소하려는 경우 유용합니다. – Yvan

+0

@Yvan 확실히 트랜잭션은 항상 * connection close *에서 롤백되므로 롤백됩니다. 하지만 트랜잭션을 사용하면 캐치를 올바르게 사용하면 유용하다는 데 동의합니다. –

관련 문제