Вкратце опишу задачу. У компании есть клиенты, от имени которых она ведет переписку с третьими сервисами используя google workspace.
У каждого email эккаунта в google workspace можно завести алиас с помощью api, и использовать его в дальнейшем для конкретной переписки. После окончания переписки алиас можно просто удалить с помощью того же api. Это нужно потому, что есть лимит на количество алиасов для каждого email эккаунта в google workspace.
Бэк реализован на python с использованием sqlalchemy. БД - postgres.
Поэтому возникла идея создать две таблицы. Одну - со списком имеющихся email эккаунтов. И вторую, где будет список использующихся в данный момент алиасов для каждого email.
То есть во второй таблице (aliases) будут следующие поля: id, email, alias_email.
Получается, когда мы начинаем новую переписку, мы должны создать новый алиас для любого email эккаунта, у которого не превышен лимит по алиасам.
То есть делаем запрос вроде
select email, count(*)
from aliases
group by email
А затем выбираем из результата любой email, у которого не превышен лимит и вставляем новую запись со свежим алиасом для этого email в эту же таблицу. Ну и создаем алиас помощью google workspace api.
При окончании переписки просто удаляем запись с алиасом из таблицы и удаляем с помощью api сам алиас.
Возникает ситуация гонок, надо бы на момент выбора алиаса лочить таблицу aliases.
Можно ли это сделать с помощью алхимии? И какие есть альтернативы в подобной ситуации, когда есть конкурентные запросы к таблице в целом, а не к конкретным записям?