2012-03-05 3 views
3

하나의 PDO 트랜잭션 내에 4 개의 테이블을 생성하려고합니다.하나의 트랜잭션 내에서 오류가있는 여러 CREATE TABLE - PDO 예외 없음

명령문의 첫 번째 "CREATE TABLE ..."부분에 오류가 있으면 성공적으로 예외, 오류 메시지 및 롤백을 얻습니다. 그러나 첫 번째 "CREATE TABLE ..."부분이 제대로 작성된 경우 (예 : 아래 예와 같이) 예외가 발생하지 않으며 커밋되어 첫 번째 표만 생성됩니다.

$conn = Connection::getInstance(); 

$conn->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$conn->dbh->beginTransaction(); 

$stmt = $conn->dbh->prepare(" 
CREATE TABLE IF NOT EXISTS `1st table` (valid SQL-code) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 

CREATE TABLE IF NOT EXISTS `2nd table` (SQL-code with an error) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 

CREATE TABLE IF NOT EXISTS `3rd table`... 
CREATE TABLE IF NOT EXISTS `4th table`... 
"); 
try 
{ 
    $stmt->execute(); 
    $conn->dbh->commit(); 
} 
catch (Exception $e) 
{ 
    $conn->dbh->rollBack(); 
    echo $e->getMessage(); 
} 

unset($stmt); 

나는 다음과 같은 note php.net에서 발견 된 일부 연구 후 : 여기

코드의 MySQL을 포함

일부 데이터베이스는 자동으로 발급 암시 적 COMMIT 때 데이터베이스 정의 언어 (DDL) 문은 DROP TABLE 또는 CREATE TABLE과 같이 트랜잭션 내에서 실행됩니다.

문제의 원인과 해결 방법은 무엇입니까?

+0

문을 연속적으로 개별적으로 실행하지 않는 이유가 있습니까? 나는 한 번의 호출로 여러 문장을 실행하는 것을 본 적이 없다. –

+0

단일 트랜잭션에서 모든 테이블을 생성하려고합니다. SQL 코드에 오류가 있으면 아무 것도 만들지 않기를 바란다. – Placido

+0

한 번의 호출로 여러 개의 PDO 문을 실행할 수 있습니다. SQL 코드에 오류가 없으면 네 개의 테이블이 모두 성공적으로 작성됩니다. – Placido

답변

1

제안 된 여러 의견 제시 자처럼 mySQL의 데이터 정의 언어 문 (DDL)에는 트랜잭션 의미론을 사용할 수 없습니다.

PDO 구현자는 명백히 DBMS에서 지원이없는 경우 클라이언트 측 트랜잭션 의미 체계를 추가하려고 시도하지 않았습니다.

관련 문제