Прежде всего, в вашей реализации есть ошибка.В случае ошибки запроса текущая транзакция автоматически откатывается и затем закрывается.Поэтому, поскольку вы продолжаете выполнять запросы, они не будут находиться в транзакции (они будут переданы в БД).Затем, когда вы выполните Rollback
, он молча потерпит неудачу.Из документов MySQL :
Rolling back can be a slow operation that may occur implicitly without the user
having explicitly asked for it (for example, when an error occurs).
Явная команда ROLLBACK
должна использоваться только в том случае, если в приложении определено, что необходимо выполнить откат (по причинам, отличным от ошибки запроса),Например, если вы вычитаете средства со счета, вы бы явно откатились, если бы обнаружили, что у пользователя недостаточно средств для завершения обмена ...
Что касается тестирования транзакций,Я делаю копию базы данных.Я создаю новую базу данных и устанавливаю набор «фиктивных данных».Затем я запускаю все тесты с помощью автоматизированного инструмента.Инструмент фактически фиксирует транзакции и принудительно выполняет откат, а также проверяет, поддерживается ли ожидаемое состояние базы данных на протяжении всех тестов.Так как сложнее запрограммированно узнать конечное состояние из транзакции, если у вас есть неизвестный ввод для транзакции, тестирование живых (или даже скопированных из живых) данных не будет легким.Вы можете сделать это (и должны), но не зависите от этих результатов, чтобы определить, работает ли ваша система.Используйте эти результаты для создания новых тестовых случаев для автоматизированного тестера ...