phpBB sql транзакция не работает

Я использую phpBB, и этот код не работает, как ожидалось. Это просто с помощью phpBB sql_transaction Функция для запуска транзакции SQL, а затем зафиксировать ее. Но исключение следует выкинуть на полпути и выполнить откат, используя ту же функцию.

Однако отката никогда не происходит. Запросы 1 и 2 вступают в силу, и я не могу их откатить.

документация заявляет, что если есть ошибка sql, он автоматически выдаст откат, но я пытаюсь откатить его, если есть ошибка php, такая как тайм-аут или что-то.

Я использую MySQL 5.7, phpBB 3.0.11 и php 5.6.

Может кто-то указать на проблему?

$db->sql_transaction('begin');

try {
$sql = 'UPDATE aaa_temp SET method = "a" WHERE id = 1';
$db->sql_query($sql);

$sql = 'UPDATE aaa_temp SET method = "b" WHERE id = 2';
$db->sql_query($sql);

throw new Exception('OMG TOTAL ERROR');

$sql = 'UPDATE aaa_temp SET method = "c" WHERE id = 3';
$db->sql_query($sql);

} catch (Exception $ex) {
$db->sql_transaction('rollback');
trigger_error($ex->getMessage(), E_USER_ERROR);
}

$db->sql_transaction('commit');

Заранее спасибо! Я знаю, что это должно быть что-то действительно простое и глупое, но дайте мне знать, если потребуется больше деталей.

РЕДАКТИРОВАТЬ: Просто чтобы было ясно, я говорю о транзакциях SQL в MySQL.

0

Решение

Оказывается, что таблица, к которой я пытался откатить обновления, использовала механизм хранения MyISAM, который не поддерживает транзакции.

По иронии судьбы, именно так их строит phpBB. sql_transaction('rollback') вернул true, потому что откат действительно работал, он просто не принимал предупреждение SQL о том, что данные не откатываются.

Понял это, включив general_query_log в MySQL, чтобы увидеть, что именно эта функция делает в фоновом режиме:

SET AUTOCOMMIT=0;

UPDATE aaa_temp SET method = "a" WHERE id = 1;

UPDATE aaa_temp SET method = "b" WHERE id = 2;

ROLLBACK;

SET AUTOCOMMIT=1;

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

0

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

У вас неправильное представление о том, как работают исключения. Если у тебя есть try{...}catch(...){...} блок, и исключение выбрасывается где-то внутри try{...} часть, то это сигнал, что ваш поток кодов перейдет к началу catch(...){...} блок.

Весь код, который произошел до того, как было сгенерировано исключение, действительно происходит. Только код внутри try Блок, который после исключения не происходит. Здесь нет rollback это имеет место, что исключает все процессы, которые были сделаны ранее, потому что это было бы чрезвычайно (чрезвычайно) трудно для разработчиков php. Представьте, что ваш PHP-код сделал что-то вроде отправки по электронной почте. Как вы ожидаете откат после того, как письмо уже было отправлено? Следовательно, откатов не бывает.

-1

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