Мы разрабатываем приложение онлайн-графика. Одно расписание может редактироваться одновременно несколькими пользователями. Есть одно очень важное деловое ограничение. Там должно быть только три события в один день.
Технически говоря и упрощенно, в базе данных есть таблица со столбцами: | id | событие | дата | Приложение запускается в транзакции "select ... count ... where ..." и, если результат меньше 3, оно вставляет новое событие.
Какие подходы можно использовать, чтобы гарантировать, что два потока не создадут четыре события за один день? Это классическая проблема проверки и записи. И нам интересно, как это можно решить на уровне базы данных?
Использование транзакций не гарантирует, что во второй транзакции другой поток не будет делать то же самое: проверяет, что число событий меньше 3, и выполняет вставку. Блокировка всей таблицы недопустима, поскольку она сократит время отклика, параллелизм и т. Д.
Приложение разработано на Java с использованием Spring, Hibernate, MySQL.
Заранее благодарим за любые советы.