Итак, скажем, есть модель A, которая выглядит следующим образом:
class A(model):
name = char(unique=True)
Когда пользователь пытается создать новую A, представление проверит, уже занято ли имя. Вот так:
name_taken = A.objects.get(name=name_passed_by_user)
if name_taken:
return "Name exists!"
# Creating A here
Раньше все работало хорошо, но по мере роста системы стали появляться параллельные попытки создания А с тем же именем. И иногда несколько запросов проходят проверку «имя существует» за те же несколько миллисекунд, что приводит к ошибкам целостности, поскольку поле имени должно быть УНИКАЛЬНЫМ, а несколько запросов на создание определенного имени проходят проверку.
Текущее решение - это «try: кроме IntegrityError:», которое оборачивается вокруг частей создания, несмотря на предварительную проверку. Есть ли способ избежать этого? Поскольку существует множество моделей с такими уникальными ограничениями, таким образом, возникает много уродливых оберток «try: кроме IntegrityError:». Можно ли заблокировать, чтобы не запретить ВЫБОР, но заблокировать, чтобы предотвратить ВЫБОР ДЛЯ ОБНОВЛЕНИЯ? Или, может быть, есть более правильное решение? Я уверен, что это общая проблема с именами пользователей и другими полями / столбцами, подобными им, и должен быть правильный подход, а не перехват исключений.
БД - это Postgres10, ORM - это SQLAlchemy из Python, но настраивается наБД напрямую применимы тоже.