我有一个循环,在两个表中插入数据,在循环的第一次迭代中插入成功,但在第二次迭代中插入将失败。
我编写了脚本,以便如果任何迭代失败,则应回滚整个事务。但是,这不起作用。
第一次迭代(成功的)不会回滚...
<?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();
}
?>
为什么整个事务没有回滚?
提前致谢。
最佳答案
要么启用了自动提交,要么连接未持续,或者您没有使用 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();
}
?>
关于php - MySQL事务,回滚不起作用,(PHP PDO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39837066/