Извините, это очень общий вопрос, но я постараюсь сузить его.
Я новичок во всей этой транзакции в 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.