У мене є запит на оновлення, який базується на результаті вибору, як правило, повертає більше 1000 рядків.
Якщо деякі з цих рядків оновлюються іншими запитами до того, як це оновлення може торкнутися їх, це може спричинити проблеми із записами? Наприклад, чи могли вони вийти з синхронізації з оригінальним запитом?
Якщо так, то краще було б вибирати та оновлювати окремі рядки, а не пакетно?
Якщо це має значення, запит запускається на Microsoft SQL Server 2008 R2
Дякую.
Відповіді:
0 для відповіді № 1Немає.
Таблицю не можна оновлювати, коли щось інше знаходиться в процесі її оновлення.
Бази даних використовують контроль одночасності та мають властивості ACID для запобігання саме такого типу проблем.
0 для відповіді № 2
Я рекомендую прочитати далі рівні ізоляції. За замовчуванням у SQL Server є READ COMMITTED
, що означає, що інші транзакції не можуть читати дані, які були оновлені, але не здійснені певною транзакцією.
Це означає, що дані, повернені вашою заявою вибору / оновлення, будуть точним відображенням бази даних в момент часу.
Якби ви змінили свою базу даних на READ UNCOMMITTED
тоді ви можете потрапити в ситуацію, коли дані вашого вибраного / оновлення не синхронізовані.
-1 для відповіді № 3
Якщо ви "вибираєте спочатку, а потім оновлюєте, ви можете використовувати транзакцію
BEGIN TRAN
-- your select WITHOUT LOCKING HINT
-- your update based upon select
COMMIT TRAN
Однак, якщо ви "оновлюєтесь безпосередньо з вибору, то про це не потрібно хвилюватися. Єдина транзакція має на увазі.
UPDATE mytable
SET value = mot.value
FROM myOtherTable mot
АЛЕ ... НЕ робіть наступного, інакше ви зіткнетесь з глухого кута
UPDATE mytable
SET value = mot.value
FROM myOtherTable mot WITH (NOLOCK)