Действительно ли выполнение хранимой процедуры T-SQL является 'атомарным'?

Хотя я полностью согласен с @Daniel Mann в том, почему этого не следует делать, я видел, как это происходит, когда команда назначается получателем запроса на утверждение, а флажок user requesting a release or deployment should not approve it остается не отмеченным. .

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


РЕДАКТИРОВАТЬ

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

enter image description here

enter image description here

После утверждения оно направляется на этапе фактического развертывания, чтобы сделать работу.

enter image description here

Теперь вам нужно добавить имя пользователя или что-то в качестве тега в сборке. Я не уверен, есть ли инструмент / задача, чтобы сделать это как часть конвейера сборки, чтобы поддерживать его непрерывность, но я знаю, что вы могли бы выяснить, как сделать это из API REST. Возможно, вам потребуется создать этап предварительного утверждения, который запускает сценарий PS для доступа к API REST и помечает предоставленную сборку значением свойства requestedBy в сборке.

1117 Опять же, видите, как трудно это сделать? Это, вероятно, означает, что вы не следуете передовым методам. «Делай правильные вещи легкими, а неправильные - тяжелыми». Неизвестный

15
задан Muhammad Hewedy 30 January 2017 в 10:07
поделиться

3 ответа

Это для SQL Server.

Каждый оператор является атомарным, но если Вы хотите, чтобы хранимая процедура была атомарной (или любая последовательность операторов в целом), необходимо явно окружить операторы

BEGIN TRANSACTION
Оператор...
Оператор...
ТРАНЗАКЦИЯ ФИКСАЦИИ

(Распространено использовать, НАЧИНАЮТ TRAN и ЗАКАНЧИВАЮТ TRAN, если коротко.)

Конечно, существует много способов войти в проблему блокировки, зависящую, что еще продолжается одновременно, таким образом, Вам, возможно, понадобится стратегия контакта с неудавшимися транзакциями. (Полное обсуждение всех обстоятельств, которые могли бы привести к блокировкам, неважно, как Вы изобретаете этот конкретный SP, выходит за рамки вопроса.), Но они все еще будут resubmittable из-за атомарности. И по моему опыту Вы, вероятно, будете в порядке, не зная о Ваших объемах сделок и других операциях по базе данных. Извините меня за утверждение очевидного.

Вопреки популярному неправильному представлению это будет работать в Вашем случае с настройками уровня транзакций по умолчанию.

12
ответ дан 1 December 2019 в 02:56
поделиться

В дополнение к размещению кода между a BEGIN TRANSACTION и END TRANSACTION, необходимо было бы удостовериться, что уровень изоляции транзакции установлен правильно.

Например, SERIALIZABLE уровень изоляции предотвратит потерянные обновления, когда код будет работать одновременно, но READ COMMITTED (значение по умолчанию в Studio управления SQL Server), не будет.

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

Как другие уже упомянули при обеспечении непротиворечивости, это может вызвать блокирование и мертвые блокировки и так не может быть лучшим решением на практике.

12
ответ дан 1 December 2019 в 02:56
поделиться

Может быть, я слишком много читаю в вашем примере (и ваша реальная ситуация может быть значительно сложнее), но почему бы вам просто не сделать это в одном утверждении?

CREATE PROCEDURE incrementCounter AS

UPDATE
    MyTable
SET
    CounterColumn = CounterColumn + 1

GO

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

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

0
ответ дан 1 December 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: