Ну, во-первых, IMO, вы не должны ожидать, что ваше приложение будет иметь дело с такими "серьезными" ошибками, как эти. Ваша заявка должна понимать, что представляют собой эти бизнес-правила, и учитывать их. НЕ заставляйте вашу базу данных быть бизнес-правилом или копом правила ограничения. Он должен быть только копом правил данных, и при этом быть изящным в сообщении интерфейса с помощью RETURN и других методов. Вещи схемы не должны так сильно навязываться.
Чтобы ответить на ваш вопрос, я подозреваю, что, не видя ни одного вашего кода, вы пытаетесь выполнить коммит, когда произошла ошибка, и вы еще этого не знаете. Это и есть причина моего первого заявления ... пытаясь поймать ошибку, которую дает база данных, не понимая и не участвуя в этих правилах, вы испытываете головную боль.
Попробуй это. Вставьте строки, которые не будут терпеть неудачу с ограничением базы данных или другими ошибками, и обрабатывать вставки с фиксацией. Посмотри что получится. Затем добавьте в некоторые записи, что потерпит неудачу , обработайте коммит и посмотрите, не получите ли вы свою прекрасную ошибку. В-третьих, снова запустите ошибки, выполните принудительный откат и посмотрите, добились ли вы успеха.
Просто некоторые идеи. Опять же, в качестве резюме, я думаю, что это связано с тем, что не нужно аккуратно фиксировать определенные ошибки в базе данных для вещей, которые являются «жесткими» ошибками, и ожидать, что клиентский интерфейс с ними справится. Опять же, мое экспертное мнение, NOPE, не делай этого. Это беспорядок. Ваше приложение должно совпадать в знаниях о правилах на обороте. Эти вещи существуют просто для того, чтобы убедиться, что этого не произойдет во время тестирования, и случайной ошибки, которая появляется, как эта, чтобы затем поместить ее перед ней для обработки забытого поиска в наборе таблиц внешнего ключа.
Надеюсь, это поможет.