Во-первых, это звучит как преждевременная оптимизация. Как отметил Стивен, большинство здравомыслящих баз данных в любом случае приведут вас к транзакции, и все, что они на самом деле делают, это вызывает commit после каждого оператора. Таким образом, с этой точки зрения, autocommit может быть менее производительным, поскольку каждый оператор должен начинать новую транзакцию. А может и нет. Только бенчмаркинг скажет, и я держу пари, что это не имеет никакого значения для вашего приложения.
Одной из причин, по которой вы всегда хотите использовать транзакцию, является согласованность защиты. Если вы начнете возиться с ручным объявлением транзакции только тогда, когда вам «нужно», тогда вы забудете в критический момент. Или этот предположительно доступный только для чтения набор операций неожиданно не возникает, либо потому, что более поздний программист не осознал, что это должно быть, либо потому, что ваш код вызывает функцию со скрытой записью. Например, я настраиваю своих клиентов базы данных командной строки, чтобы они не выполнялись автоматически. Это означает, что я могу выполнить запрос на удаление и выполнить откат.
Есть уровень изоляции, как указано. Это позволяет вам выполнять несколько операций чтения, не беспокоясь о том, что какой-то другой процесс записал ваши данные между ними, что делает ваши операции чтения действительно атомарными. Это избавит вас от многих часов отладки состояния гонки.
И, наконец, вы часто можете установить транзакцию только для чтения. Это проверит ваше предположение и выдаст ошибку, если что-то попытается написать.
Вот хорошая статья, подытоживающая все это. Детали специфичны для Oracle, но концепции являются общими.