существующих и еще текстовое поле где можно ввести доп профессию (передается параметром extra_profession). В таблице UserProfessionLink лежат айди профессий и пользователей.
Основное, почему спросил здесь -- одна профессия сохранилась дважды, также как и несколько записей в UserProfessionLink с одинаковыми айди пользователей и профессий. Как понимаю, это произошло из-за того что случайно веб-фреймворк вызвал эту функцию почти одновременно дважды? Как можно сделать, чтобы и в этом случае избежать дублирования?
И заодно, как вижу код оч длинный, наверняка алхимия позволяет писать короче, не подскажете что в этом смысле можно поменять? (но основной конечно 1й вопрос)
а с этим не подскажете, может быть есть какой-то стандартный метод блокировки от такого (оч удивился когда увидел одинаковые профессии, хоть это и единичный случай) -- кроме unique constraint конечно, или он - самое правильное решение?
Что-то никто не ответил наверное из-за того что оч длинный код. Но он простейший, и хотел только спросить откуда появилось дублирование в бд (как понимаю случайно вызвалась функция почти одновременно) и как его избежать — только юник констрейнт или есть какойто механизм блокировки вроде транзакции, который можно повесить на функцию? (Или какойто питоновский декоратор чтобы она не выполнялась одновременно)?
Гонок можно избежать, в общем случае, используя более строгие уровни изоляции транзакций, а также через явную блокировку строк (в постгресе есть еще пользовательские advisory локи). Но в случае обеспечения уникальности лучше всего использовать уникальный индекс, так как он простой и дает необходимую гаранти.
Спасибо, а как выглядит уникальный индекс? Просто добавить unique в определение поля (или отдельный констрейнт для уникальности нескольких полей вместе)? И нет ли варианта использовать какойто питоновский декоратор чтобы пока эта функция выполняется ее нельзя было вызвать?
Сергей, Вы увеличили карму Pavel Павлик до 968.94 (+7.07)
Эмм, а причем тут декораторы в питоне?
Да, необязательно они но в целом какой-то надежный способ не давать выполнить функцию если такая уже выполняется. Если функция асинхронная, вариант проставлять в начале флаг "выполняется" и проверять его — ненадёжный вариант?
Отличный план, только это так не работает
Да, ненадежный, потому что у тебя может быть несколько инстансов приложения
Да, точно, там так и есть, забыл
Не надо начинать изучать алхимию до того, как изучил SQL. Так что лучше начни с него, а потом переходи к алхимии
В основном простейшие вещи использую, но так вы правы конечно
Обсуждают сегодня