Таблицы, оптимизированные для памяти 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
Другие вопросы по тегам