kgulboev Ответов: 1

Выберите Обновить не резервируя данные


Дорогие,

Моя процедура SQL Server выбор и обновление данных и много источников триггерирование одной и той же процедуры и иногда одно и то же обновление строк из нескольких источников, есть ли у нее какой-либо способ зарезервировать данные для обновления только из одного источника?

Что я уже пробовал:

выберите Обновить но это не помогло

1 Ответов

Рейтинг:
0

Wendelius

Один из способов - использовать SELECT FOR UPDATE структура для блокировки записей во время выбора и снятия блокировок при COMMIT или ROLLBACK Для получения дополнительной информации см. MySQL :: MySQL 8.0 Справочное Руководство :: 15.7.2.4 Блокировка Считывает[^]

Если вам нужно расширить контроль за пределы границ транзакции, вы можете использовать TIMESTAMP тип данных для реализации оптимистического управления параллелизмом. О метке времени см. С mysql :: mysql с 8.0 справочник :: 11.2.2 дата, DateTime и timestamp типы[^]

Для примера оптимистичного параллелизма вы можете обратиться к Как предотвратить случайную перезапись измененных данных транзакцией[^Несмотря на то, что статья написана для SQL Server, принцип остается тем же самым.

РЕДАКТИРОВАТЬ
Снова посмотрев на этот вопрос, я почувствовал неуверенность в том, используете ли вы MySQL или SQL Server. Если вы используете Microsoft SQL Server, вы можете заблокировать выбранные записи, например, с помощью WITH UPDLOCK намекните в своем запросе, чтобы убедиться, что записи заблокированы независимо от настроек параллелизма. Видеть Табличные подсказки (Transact-SQL) - SQL Server | Microsoft Docs[^]

А в случае SQL Server статья должна быть точной.


0x01AA

Это очень интересное решение. Есть 5.

Wendelius

Спасибо :)

ZurdoDev

Однако, если есть много источников, как упоминает ОП, то вы можете создать ожидания, делая это. Хотя SQL уже блокирует запись при ее обновлении, так что я не уверен, что это что-то делает, не так ли?

Я действительно не чувствую, что ОП хорошо объяснил себя. Я чувствую, что на самом деле происходит что-то еще.

Wendelius

Блокировка-это в основном ожидание в очереди, поэтому я бы предпочел использовать существующий механизм, а не создавать пользовательский.

Разница в блокировке данных во время select заключается в типе блокировок. Когда выбор запущен и требуется блокировка обновления, никто другой не может обновить эту конкретную запись до тех пор, пока вы не отпустите блокировку. При поведении по умолчанию, даже если вы выбрали данные, кто-то другой может начать их обновление и запросить X lock, так как во время выбора приобретается только S lock.

Вполне возможно, что ОП упустил что-то важное. Если это так, будем надеяться, что они дадут больше информации :)