Я запускаю транзакцию.
Затем я должен откатывать его.
Я могу так или иначе получить список запросов, которые "отбрасываются" этот путь?
(PS: конечно, я могу зарегистрировать их заранее; я задавался вопросом, могло ли это быть сделано более "естественным" способом),
Если вы используете InnoDB, взгляните на монитор InnoDB и stderr. Я думаю, что лучше всего хранить их в приложении (сервере), поскольку оно не будет зависеть от платформы.
Если вы используете последнюю версию MySQL 5.1, это должно работать:
SHOW ENGINE INNODB STATUS включает список активных транзакций для механизма InnoDB. Каждый из них имеет префикс с идентификатором транзакции и идентификатором процесса и выглядит примерно так:
---TRANSACTION 0 290328284, ACTIVE 0 sec, process no 3195, OS thread id
34831 rollback of SQL statement
MySQL thread id 18272
<query may be here>
Идентификатор потока MySQL будет соответствовать CONNECTION_ID () вашего сеанса, который вы можете получить из SHOW FULL PROCESSLIST или information_schema.processlist, поэтому вы можете определить, какая транзакция принадлежит вам. Вам нужно будет проанализировать текст и извлечь из него запрос, если он присутствует.
Если этого недостаточно, вы можете попробовать что-то вроде SET @PROGRESS = @PROGRESS + 1 перед каждым оператором ROLLBACK, а затем SELECT @PROGRESS из DUAL в конце вашего запроса, чтобы узнать, как далеко зашла транзакция, прежде чем она достигла откат.