Запрет одновременного редактирования сущности БД

Какой подход вы используете, когда нужно, чтобы в один и тот же момент одну сущность(любая таблица) бд мог редактировать один пользователь.

  1. Раньше я криво-косо реализовывал блокировку через bool переменную, когда кто-то открывал запись и ее закрывал. Работало, но при запуске сервера приходилось обнулять все такие поля, что считаю плохой практикой. Сейчас бы, наверное, реализовал это через Redis, но тоже не до конца понимаю этого.

  2. CAS(compare and swap) - хранение версии сущности и затем ее сверка, когда клиент хочет обновить ее. Мне нравится идея, но не нравится то, что при сохранении пользователь может обнаружить, что его версия устарела и он не может сохранить данные. Тут либо ему перезагрузить все введенные данные или же рядом во вкладке показать новые данные. В общем, на мой взгляд достаточно сложно сделать удобно с точки зрения UI/UX особенно, когда он вводил с десяток полей на форме.

Пример то, как я это представляю в голове:

  1. Пользователь A открыл запись и редактирует ее. На ограниченное время или нет, я не знаю, но пусть будет 15 минут.
  2. Пользователь B пытается открыть ту же запись и получает уведомление, что сейчас ее редактирует пользователь А и ее можно открыть только в режиме чтения.
  3. Если ограничение на редактирование есть, а я думаю оно необходимо, то спустя это время пользователь А теряет возможность сохранения в бд и ему нужно перезагрузить страницу редактирования. Может быть неудобно, но пока так)

P.S Теги условные, но стек - C# WPF/Avalonia.


Ответы (1 шт):

Автор решения: DmitriySidyakin

Прочитайте документацию от производителя: Сайт Microsoft - SQL Server - Уровни изоляции транзакций (выберите нужную версию SQL Server'a)

Dapper Если вы иcпользуете Dapper Framework для доступа к БД, то там все уровни изоляций к БД пишутся на языке SQL версии БД.

Если вы используете Entity Framework, то почитайте бесплатную книгу по синхронизации потоков на этом фреймворке: Параллелизм в EF Core

Полная книга, по EF Core: EF Core

PS.: Если Вам не удобно читать документацию от носителей языка, то Вы можете пользоваться онлайн переводчиком, то можно переводить страницы онлайн, но постранично: Google Переведи Яндекс переводчик

→ Ссылка