Одно действие в PHP должно пройти следующие этапы:
- Выполнить нет. операторов mysql из PHP PDO, основанных на большом количестве бизнес-логики.
- Выполнить хранимую процедуру.
- Выполните еще несколько операторов MySQL из PDO.
Весь процесс должен быть одной транзакцией. Если в хранимой процедуре MySQL происходит какая-либо ошибка, необходимо откатить всю транзакцию. (Хранимая процедура имеет запросы для создания временных таблиц, выполнения сканирования на основе курсора и выполнения вставок.) Даже если ошибка возникает в PDO после хранимой процедуры, транзакция должна быть полностью откатана, включая любые изменения, которые произошли в хранимая процедура.
Запросы на основе PDO были запрограммированы довольно давно. И хранимая процедура вводится заново в соответствии с новыми требованиями клиента.
В PHP транзакция запускается в начале шага 1. И есть фиксация в конце шага 3. И есть блок catch в конце, который вызывает откат.
Следует ли запускать транзакцию в хранимой процедуре? Если да, то как полностью откатиться при ошибке? Или мы должны вручную установить для автоматической фиксации значение false в хранимой процедуре? Или есть другой способ сообщить MySQL, что эта хранимая процедура уже является частью транзакции.
Если нет, гарантируется ли атомарность всего действия?
Drop Table
без ключевого слова Temporary, которое вызывало автоматическую фиксацию. Как вы упомянули, хранимая процедура кажется частью транзакции. Для полноты картины и в помощь такому запутавшемуся кодеру, как я, это примечание из документации MySQL Во всех сохраненных программах синтаксический анализатор рассматривает BEGIN как начало блока BEGIN ... END. Вместо этого начните транзакцию в этом контексте с START TRANSACTION - person mohitp   schedule 06.10.2012