.NET TransactionScope класс и T-SQL TRAN COMMIT и ROLLBACK

В настоящее время я пишу приложение, которое потребует нескольких вложений, обновлений и удалений для моего бизнес-объекта. Я использую класс TransactionScope, чтобы гарантировать, что все хранимые процедуры могут фиксировать или откатываться как единое целое.

Мой вопрос: я должен также использовать COMMIT TRAN и ROLLBACK TRAN - это каждая из моих хранимых процедур, если я использую класс TransactionScope в своей библиотеке классов .NET?

Ответ 1

В 2005 году его не было необходимо, в 2000 году я бы тоже. Я обычно помещал транзакцию в блок "using".

При использовании в 2000 и более ранних версиях 2005 года возникают проблемы с производительностью.

Смотрите здесь

Спасибо

Ответ 2

Нет, вам не нужны явные транзакции при использовании TransactionScope для ваших транзакций - однако: важно, вы, вероятно, должны установить Transaction Binding=Explicit Unbind; в строке подключения. Полная информация здесь, но в остальном вы можете закончить первые несколько операций, которые будут откатны, а последние несколько совершают (или, скорее, работают вне любой транзакции).

Ответ 3

Если вы зачислен в TransactionScope или CommittableTransaction, я бы настоятельно рекомендовал вам НЕ явно создавать собственные локальные транзакции с помощью begin transaction или SqlConnection.BeginTransaction.

TransactionScope/CommittableTransaction являются другим "семейством" и являются взаимоисключающими от begin transaction/SqlTransaction

Поэтому я бы не согласился с Саифом Ханом. Это правда, что System.Transactions имеет проблемы с производительностью на Sql 2000, поэтому лучше использовать SqlTransaction или begin transaction. Однако, если вы это сделаете, вы также НЕ должны использовать TransactionScope/CommittableTransaction.

Кстати, поведение, описанное Марк Гравелл, было изменено в .Net 4.0. Даже если вы не используете Explicit Unbind, больше невозможно вернуть некоторые команды и некоторые из них зафиксировать. (Однако он прав, что в более старых версиях вы должны использовать Explicit Unbind).

Ответ 4

Вам не нужно - это должно обрабатываться в TransactionScope. Это немного зависит от того, что вы делаете, и как вы обрабатываете транзакцию (явно или неявно). Больше ЗДЕСЬ