2014-04-06 2 views
0

쿼리를 두 번 실행해야합니다. 현재 저는 이렇게하고 있습니다 :PDO 다중 쿼리 : 커밋 및 롤백 트랜잭션

// Begin Transaction 
$this->db->beginTransaction(); 

// Fire Queries 
if($query_one->execute()){ 
    if($query_two->execute()){ 

     // Commit only when both queries executed successfully 
     $this->db->commit(); 

    }else{ 
     $this->db->rollback(); 
    } 
}else{ 
    $this->db->rollback(); 
} 

올바른 방법입니까? 내 코드에서 어떤 try..catch를 사용하지 않고있어 어떤 상황에서도 부적절하거나 취약한 코드를 만들 수 있습니까?

답변

4

예. 올바른 방법입니다. Try...catch을 사용하면 어떤 경우에는보다 깔끔하고 읽기 쉬운 코드가 될 수 있지만 전반적인 접근 방식은 좋습니다. 당신의 코드가 다른 많은 DB 쿼리와하지를 처리하는 함수에서 경우

, 아마도 주변의 접근 방식을 전환 할 것 : 물론

// Begin Transaction 
$this->db->beginTransaction(); 

// Fire Queries 
if(!$query_one->execute()){ 
    $this->db->rollback(); 
    // other clean-up goes here 
    return; 
} 

if(!$query_two->execute()){ 
    $this->db->rollback(); 
    // other clean-up goes here 
    return; 
} 

$this->db->commit(); 

, 당신이되고 청소가 많이 필요한 경우 return을 수행 할 수 있기 전에 기존 방법을 사용하는 것이 좋습니다. 특히 이러한 경우에는 PDO :: ERRMODE_EXCEPTION을 사용합니다. 트랜잭션을 포착하지 않으면 자동으로 트랜잭션을 롤백하는 것과 같은 몇 가지 추가 이점이 있습니다.

2

try-catch 안에 트랜잭션을 래핑해야합니다. 대부분 예외가 발생하면 프로세스를 계속 진행할 수없는 잘못된 것이 있습니다. 예외가 어디서 올지 알 수 없습니다. 따라서 예외를 격렬히 던져 응용 프로그램을 강제 종료하는 대신이를 catch하고 데이터베이스 트랜잭션을 롤백 한 다음 다시 throw하는 것이 좋습니다.

// Begin Transaction 
$this->db->beginTransaction(); 

try { 

    $queryOne->execute(); 
    $queryTwo->execute(); 

    $this->db->commit(); 

} catch (\Exception $e) { 
    $this->db->rollback(); 
    throw $e; 
} 
+0

필요하십니까? 어때? –

+0

@YourCommonSense보다 자세한 설명을 위해 내 대답을 편집했습니다. –

+0

여전히 코드를 개선하지 못합니다. 편리를 위해 트랜잭션을 사용할 수 있지만 필수는 아닙니다. 동일한 결과로 실행 결과를 확인할 수 있습니다. 예외는 조회 결과를 독점하지 않습니다. 그리고 OP는 본질적으로 그가 그것들없이 유지할 수 있는지 물었다. 그래서,이 대답은 주어진 질문에 대해 오도 된 것으로 밝혀졌습니다. –