Запрет одновременного редактирования сущности БД
Какой подход вы используете, когда нужно, чтобы в один и тот же момент одну сущность(любая таблица) бд мог редактировать один пользователь.
Раньше я криво-косо реализовывал блокировку через bool переменную, когда кто-то открывал запись и ее закрывал. Работало, но при запуске сервера приходилось обнулять все такие поля, что считаю плохой практикой. Сейчас бы, наверное, реализовал это через Redis, но тоже не до конца понимаю этого.
CAS(compare and swap) - хранение версии сущности и затем ее сверка, когда клиент хочет обновить ее. Мне нравится идея, но не нравится то, что при сохранении пользователь может обнаружить, что его версия устарела и он не может сохранить данные. Тут либо ему перезагрузить все введенные данные или же рядом во вкладке показать новые данные. В общем, на мой взгляд достаточно сложно сделать удобно с точки зрения UI/UX особенно, когда он вводил с десяток полей на форме.
Пример то, как я это представляю в голове:
- Пользователь A открыл запись и редактирует ее. На ограниченное время или нет, я не знаю, но пусть будет 15 минут.
- Пользователь B пытается открыть ту же запись и получает уведомление, что сейчас ее редактирует пользователь А и ее можно открыть только в режиме чтения.
- Если ограничение на редактирование есть, а я думаю оно необходимо, то спустя это время пользователь А теряет возможность сохранения в бд и ему нужно перезагрузить страницу редактирования. Может быть неудобно, но пока так)
P.S Теги условные, но стек - C# WPF/Avalonia.
Ответы (1 шт):
Прочитайте документацию от производителя: Сайт Microsoft - SQL Server - Уровни изоляции транзакций (выберите нужную версию SQL Server'a)
Dapper Если вы иcпользуете Dapper Framework для доступа к БД, то там все уровни изоляций к БД пишутся на языке SQL версии БД.
Если вы используете Entity Framework, то почитайте бесплатную книгу по синхронизации потоков на этом фреймворке: Параллелизм в EF Core
Полная книга, по EF Core: EF Core
PS.: Если Вам не удобно читать документацию от носителей языка, то Вы можете пользоваться онлайн переводчиком, то можно переводить страницы онлайн, но постранично: Google Переведи Яндекс переводчик