2013-05-18 2 views
3

최근에 PHP ADODB 라이브러리를 사용하여 PDO로 변환 한 내 응용 프로그램 중 일부 코드를 수정하고 있습니다. adodb에서 일단 트랜잭션을 시작하면 begin 및 commit 명령 사이의 쿼리에 예외가 발생하면 자동으로 롤백됩니다.PHP PDO 트랜잭션 자동 롤백

PDO도이 작업을 수행합니까? 쿼리가있는 메소드가 PDO에서 begin과 commit 사이에서 실패하면 trsaction이 자동으로 롤백됩니까? 아니면 암시 적으로 호출해야합니까?

답변

5

스스로 롤백 (및 커밋)을 호출해야합니다. PDO은 사용자를 대신하지 않습니다. 다음과 같은 것 :

$pdo = new \PDO(/* ... */); 

$pdo->beginTransaction(); 

try { 
    // do stuff.. 
} catch(\Throwable $e) { // use \Exception in PHP < 7.0 
    $pdo->rollBack(); 
    throw $e; 
} 

$pdo->commit(); 

PDO rollback any open transactions when a script ends 그러나.

미해결 트랜잭션이있는 경우 스크립트가 끝나거나 연결을 닫을 때 PDO가 자동으로 다시 롤백합니다.

가 그래서 트랜잭션이 아마 응용 프로그램에 따라 롤백 얻을 것이다 (어쩌면 당신은 심지어 당신을 위해 커밋 것 어떤 장소를 청취자가?). 예외가 발생한 곳에서 명백한 롤백을하는 것이 좋습니다. http://www.php.net/manual/en/pdo.transactions.php에서

+0

하지만 ... 트랜잭션을 시작하면 몇 가지 삽입 및 업데이트를 한 다음 1보다 큰 행에서 실패한 ALTER TABLE을 만들면 기본 동작은 실제로 커밋됩니다 ... MySQL 5.7 . – 18C

+0

MySQL DDL 쿼리 (ALTER TABLE, CREATE TABLE 등)가 암시 적 커밋을 생성합니다. https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html – chrisguitarguy

10

:

스크립트를 연결하면 뛰어난 트랜잭션이있는 경우, 폐쇄하려 할 때 또는 PDO가 자동으로 롤백됩니다 종료

. ... 명시 적으로 트랜잭션을 커밋하지 않은 경우 무언가가 잘못되었다고 가정하므로 롤백은 데이터의 안전을 위해 수행됩니다.

그럼에도 불구하고 오류가 발생하면 트랜잭션을 명시 적으로 롤백하는 것이 좋습니다. If an PHP PDO transaction fails, must I rollback() explicitely?

+0

정보를 제공해 주셔서 감사합니다. 사실 매우 흥미 롭습니다. 어떻게 내가 문서에서 그것을 놓친 지 모르겠다. 다시 한번 감사드립니다. – jiraiya