Почему следующая транзакция PDO фиксирует?

Я думаю, что сам вопрос довольно очевиден. Код дан ниже -

 true );
    $db_user = 'root';
    $db_pass = '';
    $db_query = "INSERT INTO person(name, address)
                    VALUES ('Mamsi Mamsi', 'Katabon')";

    try
    {
            $PDO = new PDO($pdo_dsn, $db_user, $db_pass, 
                              $pdo_persistence);
    }
    catch(PDOException $e)
    {
            echo "Error occured: ". $e->getMessage();
            die();
    }

    $PDO->setAttribute(PDO::ATTR_ERRMODE, 
                           PDO::ERRMODE_EXCEPTION);
    $PDO->setAttribute(PDO::ATTR_AUTOCOMMIT, false);

    try
    {
            $PDO->beginTransaction();
            $PDO->exec($db_query);

            throw new PDOException('Generated Exception');

            $PDO->commit();
    }
    catch(PDOException $e)
    {
            echo "An error occured while doing a database transaction. The 
            error message is : ".$e->getMessage();

            $PDO->rollBack();
            die();
    }
?>

Даже если я откатываю транзакцию в блоке выгоды, данные все еще вставляются в базу данных. Почему?

Править

Я добавляю следующие немного строк из документации для дальнейшего разъяснения -

К сожалению, не каждый транзакции поддержки БД, таким образом, PDO должен работать в том, что известно как режим "автоматической фиксации", когда Вы сначала открываете соединение. Режим автоматической фиксации означает, что каждый запрос, который Вы выполняете, имеет свою собственную неявную транзакцию, если поддержка БД это или никакая транзакция, если база данных не поддерживает транзакции. При необходимости в транзакции необходимо использовать PDO:: beginTransaction () метод для инициирования того. Если базовый драйвер не будет поддерживать транзакции, то PDOException будет брошен (независимо от Ваших настроек обработки ошибок: это всегда - серьезное состояние ошибки). После того как Вы находитесь в транзакции, можно использовать PDO:: фиксация () или PDO:: откат () для окончания его, в зависимости от успеха кода Вы работаете во время транзакции.

Кроме того, следующие строки от этой страницы -

bool PDO::beginTransaction  ( void  )

Выключает режим автоматической фиксации. В то время как режим автоматической фиксации выключен, изменения, внесенные в базу данных через экземпляр объекта PDO, не фиксируются, пока Вы не заканчиваете транзакцию путем вызова PDO:: фиксация (). Вызов PDO:: откат () будет откатывать все изменения в базе данных и возвращать соединение для автоматической фиксации режима.

Некоторые базы данных, включая MySQL, автоматически выпускают неявную ФИКСАЦИЮ, когда заявление языка определения базы данных (DDL), такое как DROP TABLE или CREATE TABLE сделано в рамках транзакции. Неявная ФИКСАЦИЯ будет препятствовать тому, чтобы Вы откатывали любые другие изменения в границе транзакции.

7
задан MD Sayem Ahmed 17 March 2014 в 17:24
поделиться

1 ответ

Убедитесь, что вы используете INNODB в качестве типа базы данных. MyISAM не поддерживает транзакции.

16
ответ дан 6 December 2019 в 12:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: