Транзакция MySQL, откат не работает, (PHP PDO)

У меня есть цикл, который вставляет данные в две таблицы, в первой итерации цикла вставка прошла успешно, но во второй итерации вставка завершится неудачно.

Я написал сценарий так, чтобы в случае сбоя любой из итераций вся транзакция была откатана. Тем не менее, это не работает.

Первая итерация (которая прошла успешно) не откатывается …

<?php
include('model/dbcon.model.php');

$languages = array('project_nl', 'project_en');

DBCon::getCon()->beginTransaction();

$rollback = true;

foreach($languages as $language) {
$Q = DBCon::getCon()->prepare('INSERT INTO `'.$language.'`(`id`, `name`, `description`, `big_image`) VALUES (:id,:name,:description,:big_image)');
$Q->bindValue(':id', '1', PDO::PARAM_INT);
$Q->bindValue(':name', 'test', PDO::PARAM_INT);
$Q->bindValue(':description', 'test', PDO::PARAM_INT);
$Q->bindValue(':big_image', 'test', PDO::PARAM_INT);

try {
$Q->execute();
} catch (PDOException $e) {
$rollback = true;
}
}

if ($rollback) {
echo 'rollbacking...';
DBCon::getCon()->rollBack();
} else {
echo 'commiting...';
DBCon::getCon()->commit();
}

?>

Почему не откатывается вся транзакция?

Заранее спасибо.

1

Решение

Либо автоматическая фиксация включена, либо соединение не сохраняется, либо вы не используете innodb.

Это будет работать, а это значит, DBCon::getCon() не делает то, что вы думаете, что делает.

<?php
include('model/dbcon.model.php');

$languages = array('project_nl', 'project_en');$connection = DBCon::getCon();

$connection->beginTransaction();

$rollback = true;

foreach($languages as $language) {
$Q = $connection->prepare('INSERT INTO `'.$language.'`(`id`, `name`, `description`, `big_image`) VALUES (:id,:name,:description,:big_image)');
$Q->bindValue(':id', '1', PDO::PARAM_INT);
$Q->bindValue(':name', 'test', PDO::PARAM_INT);
$Q->bindValue(':description', 'test', PDO::PARAM_INT);
$Q->bindValue(':big_image', 'test', PDO::PARAM_INT);

try {
$Q->execute();
} catch (PDOException $e) {
$rollback = true;
}
}

if ($rollback) {
echo 'rollbacking...';
$connection->rollBack();
} else {
echo 'commiting...';
$connection->commit();
}

?>
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]