Как использовать транзакции MySQL в PHP? - PullRequest
0 голосов
/ 26 августа 2010

Извините, это очень общий вопрос, но я постараюсь сузить его.

Я новичок во всей этой транзакции в MySQL / PHP, но это кажется довольно простым. Я просто использую MySQL, а не MySQL или PDO. У меня есть скрипт, который, кажется, откатывает некоторые запросы, но не другие. Для меня это неизведанная территория, поэтому я понятия не имею, что происходит.

Я начинаю транзакцию с mysql_query('START TRANSACTION;'), что, как я понимаю, одновременно отключает автокоммит. Тогда у меня много сложного кода, и всякий раз, когда я делаю запрос, это что-то вроде mysql_query($sql) or $error = "Oh noes!". Затем периодически у меня есть функция с именем error_check(), которая проверяет, является ли $error не пустой, а если нет, я делаю mysql_query('ROLLBACK;') и die($error). Позже в коде у меня есть mysql_query('COMMIT;'). Но если я делаю два запроса и затем намеренно выкидываю ошибку, я имею в виду просто установить $ error = что-то, похоже, что первый запрос откатывается, а второй нет.

Что может быть не так? Есть ли какие-то ошибки с транзакциями, о которых я не знаю? У меня нет хорошего понимания того, как эти транзакции начинаются и останавливаются, особенно когда вы смешиваете с ним PHP ...

EDIT: Мой пример был чрезмерно упрощен: на самом деле у меня есть как минимум две транзакции, выполняющие INSERT, UPDATE или DELETE для отдельных таблиц. Но перед выполнением каждого из этих операторов я делаю резервные копии строк в соответствующих таблицах «истории», чтобы отменить их. Похоже, что обработка основных таблиц откатывается, но записи в таблицах истории остаются.

EDIT2: Doh! Когда я закончил набирать предыдущее редактирование, меня осенило ... должно быть что-то не так с этими конкретными таблицами ... по какой-то причине они все были установлены как MyISAM.

Ответы [ 3 ]

1 голос
/ 26 августа 2010

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

0 голосов
/ 26 августа 2010

Транзакции Mysql работают только с использованием API mysqli (а не классическими методами).Я использую транзакции.Все, что я делаю, это отключаю автокоммит и запускаю свои операторы SQL.

$mysqli->autocommit(FALSE);

SELECT, INSERT, DELETE все поддерживаются.пока я использую один и тот же дескриптор mysqli для вызова этих операторов, они находятся в оболочке транзакции.никто снаружи (не использующий тот же дескриптор mysqli) не увидит никаких данных, которые вы пишете / удаляете с помощью INSERT / DELETE, пока транзакция все еще открыта.Поэтому важно убедиться, что каждый оператор SQL запускается с этим дескриптором.После подтверждения транзакции данные становятся доступными для других подключений БД.

$mysqli->commit();
0 голосов
/ 26 августа 2010

Я бы рекомендовал использовать функции mysqli или PDO вместо mysql , поскольку они предлагают некоторые стоящие улучшения, особенно использование подготовленооператоры .

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

Вы пытались создать несколько автономных тестовых сценариев?Возможно, вы могли бы изолировать операторы SQL от вашего приложения и создать простой скрипт, который просто запускает их последовательно.Если это работает, вы сузили источник проблемы.Вы можете повторить операторы SQL из вашего приложения, чтобы получить порядок выполнения.

Вы также можете попробовать протестировать ту же последовательность операторов SQL из клиента MySQL или через PHPMyAdmin .

Ваши таблицы истории находятся в одной базе данных?

...