Сделки необходимы для перемещения базы данных из одного согласованного состояния в другое согласованное состояние. «Согласованный» здесь применяется к представлению приложения базы данных. Типичным примером является денежный перевод между двумя учетными записями: вы должны дебетовать одну учетную запись и кредит другой учетной записи. Между этими двумя операциями база данных непоследовательна, есть некоторые деньги, которые «исчезли» (сумма, дебетованная с одной учетной записи, равна нигде). Но в конце транзакции база данных снова непротиворечива. Для выполнения этих двух операций необходима транзакция, чтобы защитить читателей от просмотра несогласованной базы данных и обеспечить согласованную базу данных в случае сбоя.
Вы говорите, что для обработки нескольких элементов в вашей логике в рамках одной транзакции вам требуются сложные процедуры. Это неверно, область транзакций ортогональна области запроса: клиент может начать транзакцию, выполнить 3 операции, вызвав 3 процедуры в 3 вызовах, а затем зафиксировать транзакцию. Это не требует, чтобы все операции выполнялись в одной хранимой процедуре.
Таким образом, транзакция должна быть не вызывает существенные накладные расходы. Фактически, процедура будет не обращать внимания на транзакции. Хорошо написанная процедура должна корректно вести себя при вызове внутри транзакции, а также при вызове без транзакции. См. Exception handling and nested transactions для шаблона процедур, которые ведут себя корректно при наличии транзакций и исключений.
В конце концов, что такое real Стоимость операции? Транзакция пишет данные (читать не нужны транзакции), и поэтому они блокируют строки, измененные. Обычно считывает блок при попытке прочитать эти заблокированные строки, а затем чем длиннее транзакция, тем дольше она блокирует строки и чем больше читает ее блокирует. Но есть очень простое решение: чтение моментальных снимков. Чтение снимков - действительно волшебная пыль пикселов, они позволяют приложениям идти вперед без помех заблокированными строками, потому что читатель всегда может прочитать версию строки до до обновления, которое блокирует строку. См. Using Row Versioning-based Isolation Levels.
Таким образом, вывод прост: транзакции не имеют стоимости. Просто потому, что нет альтернативы сделкам. Не проблема «X медленнее, чем Y», это проблема «X» - это только правильный вариант ».
Обновлено
После правки: стоимость ой наличие нескольких запросов против одного запросов могут быть значительными. Поездка на сервер (т. Е. Выдача запроса по открытому соединению) имеет фиксированную стоимость. Если вы совершаете многократные поездки, вы оплачиваете эту фиксированную стоимость по каждому запросу. Если вы делаете один запрос с несколькими вызовами процедур, эта фиксированная стоимость выплачивается только один раз. В очень горячих системах, эта разница измерима и имеет общую стоимость. Но я говорю о действительно горячих системах, как в тысячах запросов в секунду. Решение, как правило, не усложнять процедуры, но выдавать многократные вызовы процедур в одном запросе:
SqlCommand cmd = new SqlCommand(@"
exec usp_firstProc @arg1, @arg2;
exec usp_secondProc @arg2, @arg3;
exec usp_thirdProc @arg1, @arg3;", connection);
cmd.Parameters.Add("@arg1", someValue);
...
cmd.ExecuteNonQuery();
Но я должен сказать, что это решение на самом деле не требуется, если у вас есть действительно горячей нагрузки. В качестве правила обратной оболочки, для чего угодно менее 1000 запросов/сек, я бы рассмотрел преимущества четкого кода, чтобы перевесить преимущества производительности.
Одна вещь другая, хотя если у вас есть открыть новое соединение для каждого запроса. Рукопожатие для входа - действительно дорого, может быть измерено в сотни мс. Но решение тривиально: объединение пулов (включено по умолчанию в ADO.Net) и не отбрасывает соединения в приложении преждевременно, сохраняйте соединение и повторно используйте его до завершения всей единицы работы.
Это не так, и я повторяю не «сложную хранимую процедуру». Если у вас несколько изменений в базе данных, которые являются единицей работы, вы должны использовать транзакцию, «стоимость» имеет только некоторые изменения и некоторые из них не были сделаны. –