it-swarm-ru.tech

Разница между неявной и явной транзакцией

В чем разница между неявной и явной транзакцией в Sql Server 2008?

Что происходит в фоновом режиме TransactionScope? Я использую TransactionScope, но в профилировщике сервера Sql не вижу оператора «Начать транзакцию ...».

Как это работает?

15
Arian

По сути, в c #, когда вы устанавливаете TransactionScope в значение Implicit, он вызывает команду SQL Server SET, чтобы перевести соединение в режим IMPLICIT_TRANSACTIONS. Все, что вы делаете (используя одну из команд, перечисленных во 2-й ссылке), запускает транзакцию, которая остается открытой до выдается коммит. Если в конце соединения не выполняется фиксация, выполняется неявный ROLLBACK.

Это отличается от настройки OFF, которая также помещает каждую инструкцию в транзакцию - разница в том, что в режиме OFF (поэтому транзакции являются явными), каждая транзакция (особая инструкция) немедленно фиксируется.

10
RichardTheKiwi

В явном режиме транзакции вам нужно явно запустить транзакцию. В режиме неявной транзакции транзакция запускается автоматически после каждой фиксации. Так что вам придется только совершить. 

Поскольку транзакция запускается «неявно», вы не увидите явного «НАЧАЛА» в журналах. :)

По умолчанию база данных работает в режиме явных транзакций с включенной автоматической фиксацией транзакций. Это фактически означает, что, если явная транзакция не запущена с использованием BEGIN TRANSACTION, каждая модификация данных запускается в отдельной транзакции, которая фиксируется после оператора. Это позволяет базе данных откатывать весь оператор при сбое (например, массовая вставка или вставка, которая изменяет другие данные в триггере).

5
GolezTrol

Неявная транзакция - это автоматическая фиксация. Там нет начала или окончания транзакции.

Явная транзакция имеет начало, конец и откат транзакций с помощью команды Начать транзакцию, зафиксировать транзакцию и транзакцию отката.

В явной транзакции, если между ними возникает ошибка, мы можем выполнить откат к началу транзакции, чего нельзя сделать в неявной транзакции.

2
Jom George

SqlTransaction - который TransactionScope использует под прикрытием - отправляет только команды T-SQL BEGIN TRANSACTION для SQL Server 2000 и более ранних версий. 

В SQL Server 2005 и более поздних версиях протокол TDS был расширен, чтобы позволить клиентам напрямую манипулировать транзакциями без отправки BEGIN TRANSACTION и т.д. Чтобы увидеть их в Profiler, выберите события «TM: Begin Tran Запуск» и т.д. Возможно, вам потребуется проверить флажок «Показать все события» для просмотра этих событий - они находятся в категории «Транзакции».

См. Запрос диспетчера транзакций в документации по протоколу TDS, TM: Начальный класс событий запуска Tran в документации Profiler и SqlInternalTransaction.ExecuteTransactionYukon в справочном источнике .NET.

0
Mike Dimmick