Я не знаю никакой выгоды от использования транзакций автоматической фиксации для этих операторов.
Возможные недостатки использования явных транзакций повсеместно могут заключаться в том, что он просто добавляет беспорядок в код и, следовательно, упрощает просмотр использования явной транзакции для обеспечения корректности нескольких операторов.
Кроме того, это увеличивает риск того, что транзакция останется открытой, удерживая блокировки, если не будет предпринята осторожность (например, при SET XACT_ABORT ON ).
Также имеет незначительное влияние на производительность, как показано в ответе @ 8kb . Это иллюстрирует это другим способом с использованием визуального студийного профилировщика.
Настройка
(Тестирование с пустой таблицей)
CREATE TABLE T (X INT)
Явные
SET NOCOUNT ON
DECLARE @X INT
WHILE ( 1 = 1 )
BEGIN
BEGIN TRAN
SELECT @X = X
FROM T
COMMIT
END
![Explicit](https://i.stack.imgur.com/iKvAF.png)
Автоматическая фиксация
SET NOCOUNT ON
DECLARE @X INT
WHILE ( 1 = 1 )
BEGIN
SELECT @X = X
FROM T
END
![Auto Commit](https://i.stack.imgur.com/bhpt9.png)
Они оба тратят время на CMsqlXactImp::Begin
и CMsqlXactImp::Commit
, но в случае явных транзакций это тратит значительно большую долю времени выполнения в этих методах и, следовательно, меньше времени на полезную работу.
+--------------------------------+----------+----------+
| | Auto | Explicit |
+--------------------------------+----------+----------+
| CXStmtQuery::ErsqExecuteQuery | 35.16% | 25.06% |
| CXStmtQuery::XretSchemaChanged | 20.71% | 14.89% |
| CMsqlXactImp::Begin | 5.06% | 13% |
| CMsqlXactImp::Commit | 12.41% | 24.03% |
+--------------------------------+----------+----------+