Хотя я полностью согласен с @Daniel Mann в том, почему этого не следует делать, я видел, как это происходит, когда команда назначается получателем запроса на утверждение, а флажок user requesting a release or deployment should not approve it
остается не отмеченным. .
Затем, чтобы избежать шума входящего почтового ящика в запросе на утверждение, отключите уведомление группы об ожидающих разрешениях на выпуск.
РЕДАКТИРОВАТЬ
Если у вас должен быть только один человек, назначенный в качестве действительного пользователя, чтобы утвердить изменения для развертывания, вы можете сделать это тоже, но это не будет красиво. Вы можете иметь «сцену» на человека. Эти этапы будут использовать фильтры артефактов в условиях перед развертыванием, чтобы отправлять только электронное письмо с подтверждением тому, для кого предназначен этот этап.
После утверждения оно направляется на этапе фактического развертывания, чтобы сделать работу.
Теперь вам нужно добавить имя пользователя или что-то в качестве тега в сборке. Я не уверен, есть ли инструмент / задача, чтобы сделать это как часть конвейера сборки, чтобы поддерживать его непрерывность, но я знаю, что вы могли бы выяснить, как сделать это из API REST. Возможно, вам потребуется создать этап предварительного утверждения, который запускает сценарий PS для доступа к API REST и помечает предоставленную сборку значением свойства requestedBy
в сборке.
1117 Опять же, видите, как трудно это сделать? Это, вероятно, означает, что вы не следуете передовым методам. «Делай правильные вещи легкими, а неправильные - тяжелыми». Неизвестный
Это для SQL Server.
Каждый оператор является атомарным, но если Вы хотите, чтобы хранимая процедура была атомарной (или любая последовательность операторов в целом), необходимо явно окружить операторы
BEGIN TRANSACTION
Оператор...
Оператор...
ТРАНЗАКЦИЯ ФИКСАЦИИ
(Распространено использовать, НАЧИНАЮТ TRAN и ЗАКАНЧИВАЮТ TRAN, если коротко.)
Конечно, существует много способов войти в проблему блокировки, зависящую, что еще продолжается одновременно, таким образом, Вам, возможно, понадобится стратегия контакта с неудавшимися транзакциями. (Полное обсуждение всех обстоятельств, которые могли бы привести к блокировкам, неважно, как Вы изобретаете этот конкретный SP, выходит за рамки вопроса.), Но они все еще будут resubmittable из-за атомарности. И по моему опыту Вы, вероятно, будете в порядке, не зная о Ваших объемах сделок и других операциях по базе данных. Извините меня за утверждение очевидного.
Вопреки популярному неправильному представлению это будет работать в Вашем случае с настройками уровня транзакций по умолчанию.
В дополнение к размещению кода между a BEGIN TRANSACTION
и END TRANSACTION
, необходимо было бы удостовериться, что уровень изоляции транзакции установлен правильно.
Например, SERIALIZABLE
уровень изоляции предотвратит потерянные обновления, когда код будет работать одновременно, но READ COMMITTED
(значение по умолчанию в Studio управления SQL Server), не будет.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
Как другие уже упомянули при обеспечении непротиворечивости, это может вызвать блокирование и мертвые блокировки и так не может быть лучшим решением на практике.
Может быть, я слишком много читаю в вашем примере (и ваша реальная ситуация может быть значительно сложнее), но почему бы вам просто не сделать это в одном утверждении?
CREATE PROCEDURE incrementCounter AS
UPDATE
MyTable
SET
CounterColumn = CounterColumn + 1
GO
Таким образом, это автоматически атомарно, и если два обновления выполняются одновременно, они всегда будут заказаны SQL Server, чтобы избежать описываемого вами конфликта. Если, однако, ваша реальная ситуация намного сложнее, то обернуть ее в транзакцию - лучший способ сделать это.
Однако, если другой процесс включил "менее безопасный" уровень изоляции (например, такой, который позволяет грязные или неповторяющиеся чтения), то я не думаю, что транзакция защитит от этого, так как другой процесс может видеть частично обновленные данные, если его выбрали для того, чтобы разрешить небезопасные чтения.