PHP PDO транзакция rollBack не работает

Как все
Пожалуйста, кто-нибудь может мне помочь в этом
Я пытаюсь использовать транзакцию PHP PDO, и у меня есть проблема, с которой я не могу справиться.
Функция rollBack не работает, когда ловит исключение
Вот код подключения

$host   = 'localhost';
$user   = 'root';
$pass   = '';
$error  = '';
$dbname = 'tameras_finance';
// Set DSN
$dsn = 'mysql:host=' . $host . '; dbname=' . $dbname;
// Set options
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
// Create a new PDO instanace
try {
$dbh = new PDO($dsn, $user, $pass);
$dbh->exec("set names utf8");
}
//Catch any errors
catch (PDOException $e) {
echo $error = $e->getMessage();
}

а вот код

try{
$dbh->beginTransaction();
$dbh->query('SET @newDebit = (SELECT max(`debtor_id`) + 1 AS maxDebit FROM `vocher`)');
for($x = 0; $x < count($debits); $x++){
$dbh->query('UPDATE `vocher` SET `debtor_id` = @newDebit, `status_id` = "4" WHERE `id` = '.$debits[$x]);
}

for($x = 0; $x < count($others); $x++){
$columns = '`acc_id`, `value`, `date`, `desc`, `reject`, `vo_type_id`, `user`, `debtor_id`';
$vals  = "'".$accs[$x]."','".$values[$x]."','".$dates[$x]."','".$descs[$x]."','1','1','".$user."', @newDebit";
if($others[$x] == 'e'){
$columns .= ', `cheque_no`, `available_date`, `issue_date`, `bank_id`';
$vals  .= ", '".$sns[$x]."', '".$availdates[$x]."', '".$issueDates[$x]."', '".$banks[$x]."'";
}
$dbh->query("INSERT INTO creditor (".$columns.") VALUES (".$vals.")");
if($lists[$x] != 'e'){
$lastId = $dbh->lastInsertId();
$q  = 'INSERT INTO `creditor_cc` (`creditor`, `cc`) VALUES ';
for($y = 0; $y < count($lists[$x]); $y++){
$dif = count($lists[$x]) - $y;
$q .= '(';
$q .= '"' . $lastId . '",';
$q .= '"'.$lists[$x][$y].'"';
$q .= ')';
if($dif > 1){
$q .= ',';
}
}
$dbh->query($q);
}
}
$dbh->commit();
} catch(PDOException $e) {
echo $error = $e->getMessage();
$dbh->rollBack();
}

Этот код не откатывается
Обратите внимание, что:

  • $ sns, $ others, $ accs, $ values, $ date, $ descs, $ availabledates,
    $ IssueDates и $ Banks — это массивы одинакового размера.
  • Также $ lists — это двумерный массив с одинаковым размером

пожалуйста, помогите мне с этим, почему этот код не катится назад

2

Решение

Транзакции не поддерживаются типом таблицы MySQL по умолчанию MyISAM, Вы должны убедиться, что вы используете InnoDB столы.

Также убедитесь, что выбрасываемое исключение PDOException или он провалится try/catch и не ударил ваш откат.

3

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

Я бы сказал, что это должно быть сделано так:

$pdo = new \PDO(/*...*/);

$pdo->beginTransaction();

try {
//...
} catch(\Exception $e) {
$pdo->rollBack();
throw $e;
}

$pdo->commit();
0

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