문제

나는 겪고있다 이 튜토리얼 PDO에 대해 그리고 거래에 관한 요점에 도달했습니다.연결 부분을 건너뛰면 다음과 같은 PHP 코드가 있습니다.

try
{
    $db->beginTransaction();

    $db->exec('DROP TABLE IF EXISTS animals');

    $db->exec('CREATE TABLE animals ('
        .'animal_id MEDIUMINT(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,'
        .'animal_type VARCHAR(25) NOT NULL,'
        .'animal_name VARCHAR(25) NOT NULL)'
        .'ENGINE=INNODB');

    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("emu", "bruce")');
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("funnel web", "bruce")');
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("lizard", "bruce")');
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("dingo", "bruce")');
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("kangaroo", "bruce")');
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("wallaby", "bruce")');
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("wombat", "bruce")');
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("koala", "bruce")');
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("kiwi", "bruce")');

    $db->commit();

    echo 'Table re-created and data entered successfully.';
}
catch(PDOException $e)
{
    $db->rollback();

    echo $e->getMessage();
}

어딘가에 오류를 넣은 경우를 제외하고는 훌륭하게 실행되고 내가 생각했던 대로 작동합니다.네 번째 insert 문에서 실수를 했다면 내 데이터베이스에서 세 마리의 동물을 찾을 것입니다.하지만 저는 모든 것이 롤백되어야 한다고 생각했습니다. 즉, 이 스크립트를 실행하기 전과 같은 데이터베이스를 찾을 수 있다는 뜻이었습니다.

제가 뭔가 잘못 이해한 걸까요?내가 무엇을 놓치고 있나요?트랜잭션 및 롤백 기능이 내가 생각하는 것과 다른 작업을 수행합니까?drop 및 create 문이 어떻게든 트랜잭션을 "중단"합니까?여기서 무슨 일이 일어나고 있는 걸까요?


업데이트: 내가 옮기면 $db->beginTransaction(); 행을 사용하여 테이블이 생성된 후에만 트랜잭션이 시작되도록 하면 예상했던 동작을 얻습니다.따라서 세 번째 insert 문이 실패하면 트랜잭션이 롤백된 후 (방금 다시 생성되었기 때문에) 빈 테이블을 갖게 됩니다.그래도 drop 및 create 문이 트랜잭션에 있을 때 왜 작동하지 않는지 궁금합니다.

도움이 되었습니까?

해결책

PHP 참조 매뉴얼을 확인하세요: PDO::시작트랜잭션

MySQL을 포함한 일부 데이터베이스는 DROP TABLE 또는 CREATE TABLE과 같은 데이터베이스 정의 언어(DDL) 문이 트랜잭션 내에서 실행될 때 자동으로 암시적 COMMIT를 실행합니다.암시적 COMMIT는 트랜잭션 경계 내의 다른 변경 사항을 롤백하는 것을 방지합니다.

이것이 왜 이런 일이 발생하는지 설명하며 이는 PDO/PHP가 아닌 MySQL의 제한 사항입니다.

다른 팁

모든 테이블이 트랜잭션을 지원하는지 확인하세요.예를 들어 MyISAM은 지원하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top