Ребят, подскажите пожалуйста.
Есть таблица t1, в ней есть поле num.
Мне нужно:
1. найти максимальный num в этом году.
select max(num) as maximus form t1 where year = '2020';
2. вставить новую запись с новым(инкрементированным) номером.
insert .... into t1 values(maximus+1);
Но при этом в условиях согласованного чтения это все не подходит. Ибо одновременно могут другие транзакции читать эти записи.
И вставить, соответственно, запись с одним и тем же номером.
Я пробовал:
select max(num) as maximus form t1 where year = '2020' for update;
Но это бессмысленно, ибо я блокирую эти записи на изменение для других транзакций.
А мне нужно их блокировать на чтение от других транзакций.
Подскажите плз, как это лучше сделать?
Если база не нагруженая, то можно кинуть уникальный составной индекс и кэтчить экспепшены.
Ещё можно использовать именованые локи - GET_LOCK.
А лучше всего вынести эти значения в отдельную таблицу и блокировать там.