Рассмотрим вложенные транзакции .
Большинство РСУБД не поддерживают вложенные транзакции или пытаются эмулировать их очень ограниченным образом.
Например, в MS SQL Server откат во внутренней транзакции (которая не является реальной транзакцией, MS SQL Server просто считает уровни транзакций!) Откатит все, что произошло в outmost транзакция (которая является реальной транзакцией).
Некоторые оболочки баз данных могут рассматривать откат во внутренней транзакции как признак того, что произошла ошибка, и откатить все в самой внешней транзакции, независимо от того, была ли совершена самая крайняя транзакция или откат.
Таким образом, COMMIT является безопасным способом, когда вы не можете исключить, что ваш компонент используется каким-либо программным модулем.
Обратите внимание, что это общий ответ на вопрос. Пример кода ловко обходит проблему с внешней транзакцией, открывая новое соединение с базой данных.
Относительно производительности: в зависимости от уровня изоляции для SELECT может потребоваться различная степень блокировок и временных данных (моментальных снимков). Это очищается, когда транзакция закрыта. Неважно, будет ли это сделано через COMMIT или ROLLBACK. Там может быть незначительная разница в затрачиваемом времени процессора - анализ, вероятно, быстрее, чем ROLLBACK (на два символа меньше) и другие незначительные различия. Очевидно, это верно только для операций только для чтения!
Полностью не требуется: другой программист, который может прочитать код, может предположить, что ROLLBACK подразумевает условие ошибки.