Я пытаюсь написать запрос, который обновляет строку в таблице "претензии" до активного состояния только в том случае, если пользователь не имеет более двух активных заявок, открытых уже. Поэтому для обеспечения целостности данных очень важно, чтобы пользователь никогда не открывал более двух активных заявок в любой момент времени.
Я запускаю этот запрос в параллельной среде, поэтому возможно, что два процесса выполняют этот запрос одновременно. Я также запускаю его под уровнем изоляции Read Committed
по умолчанию.
Мне интересно, могу ли я открыть возможность того, что пользователь может открыть более двух активных заявлений в какой-то момент из-за условия гонки между подзапросом и предложением обновления.
В то же время производительность не так важна для этого запроса, как целостность данных.
update claim
set is_active = '1'
where claim.id = %s
and (2 > (select count(*)
from claim as active_claim
where active_claim.user_id = %s
and active_claim.is_active = '1'))