Делая последовательность SQL-операторов атомарной - PullRequest
0 голосов
/ 19 июля 2011

Мне нужно сделать следующую последовательность шагов в атомном элементе.Вот примерный упрощенный пример:

Таблица клиентов (CustomerId, .., OrderMax)
Таблица продуктов (ProductId, ...)
Представление AvailableProducts (ProductId и другие свойства)
Заказы(CustomerId, OrderId)

  1. выберите @OrderMax из таблицы "Клиенты"
  2. выберите TOP @Ordermax из представления "Доступные продукты"
  3. обновите некоторые свойства в Продуктах на основенабор результатов шага 2
  4. вставка заказов в таблицу заказов (на основе набора результатов шага 2)
  5. возврат / выбор заказов, которые были вставлены

как IПонимаете, должна быть сделка на все это и UPDLOCK.Необходимо обеспечить таблицу продуктов для обновления и таблицу заказов для вставки.Однако строки запрашиваются из представления, построенного из обеих этих таблиц.

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

1 Ответ

1 голос
/ 21 июля 2011

Необходимо обернуть всю свою логику в Начальную транзакцию, Подтвердить транзакцию.Обновление / вставка на самом деле не заботятся о том, поступили ли данные из объединения, если только оно каким-то образом не создало ситуацию, при которой не удалось бы откатить транзакцию, но для создания такой ситуации пришлось бы запутаться.Если 3. и 4. имеют сложную логику, вас могут заставить использовать курсор или .NET (но вы можете сделать довольно сложную логику с обычными запросами).

...