2013-12-11 5 views
0

PDO::beginTransaction을 실행하면 어떤 이유에서든 스크립트가 종료되고 변경 사항이 명시 적으로 커밋되지 않은 경우 (오류, 예외, exit/die 등) 트랜잭션이 실행됩니다. 롤백 할 수 있습니다.PDO :: rollBack 또는 __destruct

마찬가지로 스크립트가 끝나면 모든 개체에있는 __destruct 메서드가 마찬가지로 실행됩니다.

내 질문은, 스크립트가 끝나고 먼저 PDO::rollBack 또는 __destruct 메쏘드에서 호출 된 미해결 데이터베이스 트랜잭션이 있습니까?

답변

4

PHP 스크립트가 끝나고 뛰어난 PDO 트랜잭션이있는 경우 PDO::rollBack은 PHP에 의해 호출되지 않지만 대신 PHP가 서버에 대한 연결을 닫는 즉시 나머지 트랜잭션이 데이터베이스 서버 자체에서 롤백됩니다 어떤 destructors 또는 shutdown functions이 실행 된 후에 발생합니다.

따라서, 우리는 다음과 같은 경우 :

$dbh = get_dbh(); 

class Test 
{ 
    public function __construct(PDO $dbh) 
    { 
     $this->_dbh = $dbh; 
    } 

    public function __destruct() 
    { 
     $stmt = $this->_dbh->prepare(" 
      UPDATE some_table 
      SET some_column = :val"); 
     $stmt->bindValue('val', time()); 
     $stmt->execute(); 
    } 
} 

$test = new Test($dbh); 

$dbh->beginTransaction(); 

// End of file 

__destruct 방법 쿼리 실행 후 즉시 롤백됩니다.

+0

놀랍게도 google을 사용하여 진행중인 트랜잭션이있는 동안 PHP가 종료되면 변경 사항이 $ dbh-> rollback()이 호출 된 것처럼 롤백된다는 명시적인 설명을 찾습니다. 트랜잭션이 시작된 연결이 닫히면 실제로 데이터베이스의 속성 인 반면 PHP 및 PDO와 관련하여 검색 중이기 때문에 이것이라고 생각합니다! – sootsnoot