Мне нужно решить шаблон резервирования ресурсов с помощью Spring и MariaDB.Проблема очень проста, у меня есть гостевая таблица, где я храню гостевые имена событий, я должен быть уверен, что число гостей для события должно быть меньше или равно максимальной емкости.
Это таблица:
create table guest(
event int,
name varchar(50)
)
create index event on guest (event);
Какова правильная процедура блокировки и уровень изоляции для БД?Обратите внимание, что этот код будет работать в многопоточном контейнере.Я решил заблокировать таблицу с помощью команды «SELECT ... FOR UPDATE», чтобы ограничить блокировку только одной строкой события.
// START TRANSACTION
@Transactional
public void reserve(int event, String name){
getJdbc().query("SELECT * FROM guest WHERE id=? FOR UPDATE",event);
Integer count=getJdbc().queryForObject("SELECT COUNT(*) FROM guest WHERE id=?",Integer.class,event);
if(count>=MAX_CAPACITY)
throw new ApplicationException("No room left");
getJdbc().query("INSERT INTO guest VALUES (?,?)",event,name);
}
// COMMIT
Я провел некоторый тест и, похоже, мне нужны уровни изоляции READ_COMMITTED,Я прав?Вот что я нашел: ![enter image description here](https://i.stack.imgur.com/ktamj.jpg)
Это первый раз, когда мне нужно изменить уровень изоляции, и я немного удивлен этой необходимостью, можете ли вы подтвердить, что стандартОшибка уровня MariaDB REPETABLE_READ с этим шаблоном?