Является ли хорошей практикой всегда использовать TransactionScope в базовом классе DAL? - PullRequest
2 голосов
/ 27 мая 2011

У меня есть базовый класс DAL, который централизует весь код вызова базы данных в моем приложении.Я хочу убедиться, что все действия вставки / обновления / удаления обернуты в транзакции, независимо от того, была ли она записана в SP или нет.Будет ли хорошей практикой оборачивать мой метод DAL «ExecuteNonQuery» в TransactionScope или я добавлю много накладных расходов на вызовы БД, которые не требуют этого.в пользовательском интерфейсе, когда требуется обернуть несколько вызовов служб, на самом деле он просто обеспечивает его на уровне SP, в котором я не уверен.

Я использую .net 3.5 и в основном SQLServer 2008, некоторые клиенты все еще используют 2005- в надежде перенести это в ближайшее время.

Спасибо

Ответы [ 2 ]

4 голосов
/ 27 мая 2011

Tsansactions (и в частности, тяжелые веса, такие как TransactionScope, даже с LTM) в основном включаются при применении нескольких операций, которые могут охватывать более одного вызова дБ.

Добавление транзакций может быть важным, но это меняет природу запроса; вы могли бы ввести взаимные блокировки как наиболее очевидные, но вы также можете изменить предполагаемый побочный эффект метода, который является ошибочным. Он также может исправить в противном случае непреднамеренный побочный эффект. Он изменяет профиль блокировки и предъявляет другие системные требования (наиболее очевидным является включение DTC).

Так что праздно не добавляйте их.

Точно так же многие экраны просмотра только для чтения не нуждаются в какой-либо специальной блокировке; черт возьми, большая часть списка / поиска / и т. д. не изменится каким-либо важным способом, если вы увидели текущую транзакцию с фантомными / грязными / неповторяющимися / etc данными.

Лично, когда я использовал код, основанный на SP, я не имел тенденцию помещать управление транзакциями в SP - часто бывает проще: и , чтобы поднять его до более высокого уровня. уровень с более сложным управлением ошибками - то есть почти всем, кроме TSQL, который не предназначен для , чтобы быть хорошим в процедурном коде. Очевидно, он хорош в DML на основе множеств.

0 голосов
/ 27 мая 2011

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

Привет

Piotr

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