Таблицы, оптимизированные для памяти SQL Server, выявляющие нарушение параллелизма
В таблицах, оптимизированных для памяти SQL Server, rowversion
тип данных не допускается.
В моем приложении я все еще хочу иметь возможность обнаруживать нарушение параллелизма, когда пользователь A открывает элемент для редактирования, пользователь B открывает тот же элемент, пользователь A сохраняет и пользователь B сохраняет, не видя изменений пользователя A. Я использовал rowversion
колонка для этого годами. Какова рекомендация для управления моей собственной подделкой rowversion
столбец?
2 ответа
Вы не упомянули, какой язык интерфейса вы используете, но вот совет из моего опыта работы с наборами данных C# и опцией "использовать оптимистичный параллелизм".
Когда вы загружаете строку в DataTable, dt отслеживает загруженные исходные значения:
SELECT id, name, age, address FROM person
--> 1, Jon, 33, null
Вы делаете обновление:
dt[0].Name = "Paul"
Теперь в строке отслеживаются два значения: оригинальное (Jon) и текущее (Paul)
Отправляя обновление обратно в базу данных, он запускает такой запрос:
UPDATE person
SET name = @currentName
WHERE id = @originalID and
(Name = @originalName or (@originalName is null AND name is null)) AND
...
Так эффективно:
UPDATE person
SET name = 'Paul'
WHERE id = 1 and
(Name = 'John' or ('John' is null AND name is null)) AND...
Таким образом, данные, которые были изменены / обнулены / не обнулены сторонним клиентом, могут быть обнаружены
Проще всего использовать ORM для вашего языка, который имеет эту возможность
-
ps: возможно, для этого проще добавить столбец int и триггер для его увеличения. Хотя, вероятно, большинству людей не совсем удастся добавить столбец, предназначенный исключительно для управления информацией, а не для моделирования реального аспекта данных сохраненной сущности.
Подсистема таблиц с оптимизацией памяти имеет встроенную поддержку оптимистичного параллелизма.
Транзакции с таблицами, оптимизированными для памяти
Код ошибки: 41302
Описание: Попытка обновить строку, которая была обновлена в другой транзакции с момента начала текущей транзакции.
Причина. Это условие ошибки возникает, если две одновременные транзакции пытаются обновить или удалить одну и ту же строку одновременно. Одна из двух транзакций получает это сообщение об ошибке и должна быть повторена.
Для других сценариев, таких как ситуация "Открыть учетную запись клиента в CRM", вы по-прежнему можете использовать методы старой школы, такие как использование номера версии строки, примененной вручную, которую вы вводите в свои предикаты.
Например:
UPDATE
[MyTable]
SET
[Col001] = 'SomeVal'
WHERE
PK = @primaryKey
AND [RowVersionColumn] = @rowVersionStashedFromSelect