Стандартният начин е да НЕ се справяте с това, като:
- вероятността за неуспех във вашия случай е близка до 0;
- тежестта на повредата е много ниска.
Ако по някаква причина трябва да сте сигурни, че проблемът няма да се случи, вие сте сами.
Не съм анализирал подробно последователността от събития, но мисля, че използването на нивото на изолация SERIALIZABLE няма да помогне наистина, само ще причини IntegrityError
(или DatabaseError
) да бъдат отгледани на друго място.
Отмяна на Model._perform_unique_checks
звучи ми като лоша идея, по-добре стойте далеч от маймунски кръпки, ако е възможно (и ето го е възможно).
Що се отнася до използването на заключване на масата за предотвратяване на малко вероятни грешки... Е, аз не съм голям фен, така че не мога да препоръчам и това.
Ето един хубав отговор на подобен въпрос:https://stackoverflow.com/a/3523439/176186 - Съгласен съм, че улавя IntegrityError
и повторният опит е може би най-лесният разумен начин за справяне с проблема.
РЕДАКТИРАНЕ:Намерих това:Symfony2 - как да се възстанови от уникална грешка при ограничение след подаване на формуляр? и съм съгласен с отговора на @pid.