SQL транзакция - SQL Server или C #? - PullRequest
       14

SQL транзакция - SQL Server или C #?

7 голосов
/ 07 декабря 2010

Прав ли я, говоря, что с точки зрения производительности транзакции sql в хранимой процедуре намного лучше, чем в коде?

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

Просто была сложная подпрограмма, которая требовала слишком много «переменных», поэтому написание транзакции sql в c # было намного проще, чем использование SQLСервер.Это тонкая грань между удобочитаемостью кода и производительностью.

Есть идеи?

Ответы [ 6 ]

7 голосов
/ 07 декабря 2010

Производительность варьируется; SqlTransaction может иметь меньше служебных данных, чем TransactionScope, особенно если TransactionScope решит, что ему нужно запутаться с DTC. Но я не ожидал бы огромной разницы между SqlTransaction и BEGIN TRAN, за исключением дополнительного туда-обратно. Однако TransactionScope по-прежнему быстр и является наиболее удобным вариантом для инкапсуляции нескольких операций в транзакции, так как нет необходимости каждый раз вручную связывать транзакцию с командой.

Возможно, лучшим (и более значительным) фактором является уровень изоляции . TransactionScope по умолчанию самый высокий (сериализуемый). Более низкие уровни изоляции позволяют более для меньшего количества блокирования (но с риском неповторяющихся чтений и т. Д.). IIRC транзакция TSQL по умолчанию относится к одному из нижних уровней. Но уровень изоляции можно настроить для всех 3 вариантов.

2 голосов
/ 07 декабря 2010

Я за TransactionScope.Согласно Марку, используйте фабричный метод на TransactionScope, чтобы снизить уровень изоляции до READ COMMITTED для наиболее распространенных случаев, которые я могу себе представить.

Обратите внимание, что вы можете использовать обе транзакции SQL И TransactionScope -SQL BEGIN TRAN / COMMIT TRAN будет мало влиять на TransactionScope (кроме увеличения / уменьшения @@TRANCOUNT) - таким образом, если вам нужно вызвать тот же SQL Sproc в другом месте, например, из запроса adhoc, который вы будете использоватьпо-прежнему получайте выгоду от транзакции.

Преимущество TransactionScope IMO заключается в том, что он будет управлять DTC для вас, если вам действительно потребуется выполнить двухфазную фиксацию (например, несколько баз данных, очереди или другие транзакции XA).А с SQL 2005 и более поздними версиями он работает с Lightweight Transaction Manager , поэтому DTC не требуется, например, если все обращения к одной базе данных, одно соединение за раз.

1 голос
/ 07 декабря 2010

Это зависит от того, какое приложение.

Но я скажу, что в большинстве случаев лучше всего удивляться наличию логики в базе данных.Также очень полезно иметь бизнес-логику в базе данных, это то, что тогда она будет такой же, даже если у вас есть райдеры, версия WinForms и веб, или что-то еще.SQL.Негатив с этим, администратору базы данных становится намного сложнее найти какие-либо ошибки или что-то еще.производительность.

1 голос
/ 07 декабря 2010

Если вы имеете в виду, что вы пишете транзакции SQL на C # и используете ADO.Net или аналогичные программы для их выполнения, то они, вероятно, менее эффективны, поскольку SQL будет кэшировать план запроса для хранимой процедуры (что также в настоящее время относится к Entity Framework - хотя все еще не так быстро, как proc, я не думаю) поэтому на самом деле вам, вероятно, следует делать это наоборот - сложные процедуры в SQL, чтобы получить преимущества кэширования (если бы это было так просто ...)

1 голос
/ 07 декабря 2010

Я верю, что процедура магазина будет иметь лучшую производительность.

1 голос
/ 07 декабря 2010

Управление транзакциями в коде (читай c #) является опцией, которой необходимо следовать для управления транзакциями через несколько источников данных или системы. Для управления транзакциями для одной базы данных управление на стороне сервера всегда будет проще. Но если вы считаете, что коду может потребоваться сценарий, когда в транзакцию добавляется несколько источников данных, удерживайте транзакции на уровне кода.

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