Класс .NET TransactionScope и T-SQL TRAN COMMIT и ROLLBACK - PullRequest
5 голосов
/ 10 октября 2008

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

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

Ответы [ 4 ]

8 голосов
/ 10 октября 2008

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

2 голосов
/ 10 октября 2008

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

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

См. здесь

Спасибо

1 голос
/ 20 августа 2010

Если вы зачислены в 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).

0 голосов
/ 10 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...