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

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

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

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


person Arian    schedule 13.02.2011    source источник


Ответы (4)


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

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

person RichardTheKiwi    schedule 14.02.2011
comment
Правильно говорить, что транзакции являются явными в режиме implicit_transactions off, если вы (явно) используете BEGIN TRANSACTION ..., в противном случае это называется режимом autocommit. - person jlb; 09.01.2017

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

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

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

person GolezTrol    schedule 13.02.2011
comment
Спасибо. Я знаю, что когда мы выполняем один статус INSERT, он выполняется в неявной транзакции. Вы говорите, что неявная транзакция будет начинаться после каждой фиксации. Учтите, что у нас есть 2 сатимента в TransactionScope, что второй статус вызовет исключение. когда первый статус 1 завершит его совершение и будет создана новая транзакция. Вы говорите это? Но почему, когда вторая транзакция выдает исключение, вся транзакция будет откатываться в TransactionScope? - person Arian; 13.02.2011
comment
@Kerezo нет, после фиксации транзакции все операторы будут заблокированы в базе данных с момента последней фиксации. поэтому, если какой-либо оператор выдает исключение, единственной потерей будет количество операторов, выполненных после этого последнего коммита. - person zzlalani; 25.11.2013

Неявная транзакция — это автоматическая фиксация. У сделки нет ни начала, ни конца.

Explicit Transaction имеет начало, завершение и откат транзакций с помощью команд Begin Transaction, Commit Transaction и Rollback Transaction.

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

person Jom George    schedule 25.09.2014
comment
Неявная и автоматическая фиксация — разные вещи. Когда вы устанавливаете IMPLICIT_TRANSACTIONS ON, следующая отправляемая вами команда DML запускает новую транзакцию. Эти изменения ожидаются до тех пор, пока вы не выполните COMMIT или ROLLBACK. Если вы отключаетесь без отправки COMMIT, он автоматически откатывается. Автоматическая фиксация происходит, если вы отправляете команду DML с выключенным параметром IMPLICIT_TRANSACTIONS и без явной ожидающей транзакции — здесь данные автоматически фиксируются в конце выполнения команды DML до обработки следующей команды. Я никогда не использовал неявные транзакции. - person Mike Dimmick; 06.05.2015

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

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

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

person Mike Dimmick    schedule 06.05.2015