/ / Чи можуть бути змінені дані в моїх таблицях, які будуть порушувати пакетне оновлення під час зміни кількох рядків? - паралельність, sql-сервер-2008-r2

Чи можуть дані в моїх таблицях змінюватися, що призведе до зміни партійного оновлення при зміні кількох рядків? - паралельність, sql-server-2008-r2

У мене є запит на оновлення, який базується на результаті вибору, як правило, повертає більше 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)