Sql Server транзакции - рекомендации по использованию - PullRequest
3 голосов
/ 08 июня 2011

Я видел это предложение не только в одном месте:

"Транзакция должна быть максимально короткой, чтобы избежать проблем с параллелизмом и обеспечить максимальное количество положительных подтверждений."

Что это на самом деле означает?

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

Например, у меня есть служба, которая предоставляет метод: AddObjects(List<Objects>) и, конечно, эти объекты содержат другие вложенные различные объекты.

Я думал начать транзакцию для каждого вызова от клиента, выполняющего соответствующие действия (связка вставки / обновления / удаления для каждого объекта со своими вложенными объектами). EDIT1: Я имел в виду транзакцию для всего вызова "AddObjects", чтобы предотвратить неопределенные состояния / поведение.

Я иду в неправильном направлении? Если да, как бы вы это сделали и каковы ваши рекомендации?

EDIT2: Кроме того, я понял, что транзакции выполняются быстро для массовых операций, но это как-то противоречит цитируемому предложению. Какой вывод?

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 08 июня 2011

Транзакция должна охватывать бизнес-единицу работы. Он не имеет ничего общего с общими «объектами», он всегда должен быть выражен в специфических для домена терминах: «дебет счета X и кредит счета Y должны быть в транзакции», «вычитание предмета инвентаря и продажа должны быть в транзакции и т. д. и т. д. Все, что должно либо преуспеть вместе, либо провалиться вместе, должно быть в транзакции. Если вы идете по абстрактному пути «добавление объектов в список - это транзакция», тогда да, вы находитесь на неправильном пути. Тот факт, что все вставки / обновления / удаления, инициированные сохранением объекта, находятся в транзакции, является не целью, а побочным эффектом. Правильная семантика должна быть «обновление объекта X и обновление объекта Y должно быть в транзакции». Даже вырожденный случай обновления одного «объекта» все равно следует рассматривать с точки зрения терминов, специфичных для предметной области.

3 голосов
/ 08 июня 2011

Эту рекомендацию лучше всего понимать как Не разрешать взаимодействие с пользователем в транзакции.Если вам нужно спросить пользователя во время транзакции, откатитесь, спросите и запустите снова.

Кроме этого, используйте транзакцию всякий раз, когда вам нужно обеспечить атомарность.
Это не транзакция«проблема в том, что они могут вызывать« проблемы параллелизма », это тот факт, что базе данных может потребоваться больше размышлений, лучший набор индексов или более стандартизированный порядок доступа к данным».

1 голос
/ 08 июня 2011

"Транзакция должна быть максимально короткой, чтобы избежать проблем с параллелизмом и обеспечить максимальное количество положительных коммитов."

Чем дольше транзакция остается открытой, тем больше вероятность, что она заблокирует необходимые ресурсыдругими транзакциями.Эта блокировка приведет к тому, что другие параллельные транзакции будут ожидать ресурсов (или потерпят неудачу в зависимости от дизайна).

Сервер Sql обычно настраивается в режиме автоматической фиксации.Это означает, что каждый оператор SQL является отдельной транзакцией.Много раз вы хотите использовать транзакцию с несколькими утверждениями, чтобы вы могли зафиксировать или откатить несколько обновлений.Чем дольше выполняются обновления, тем вероятнее конфликт других транзакций.

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