Вы описываете логические дизъюнкции.
в последнем случае вам нужно составить счет и сказать, что клиент заплатил что-то, что не было сделано через систему, чтобы знать, что он это сделает.
В первом случае ошибка просто указывает на очевидное. Такая же ситуация с доступом к диску и файловым дескрипторам. То, что вы не можете записать в файл при проверке, не означает, что вы можете записать в файл, когда попытаетесь это сделать.
Вы должны обработать ошибки.
В первом случае я не понимаю, почему вы не можете сказать, в какое время сумма находилась на рассмотрении. Если отправка пустых счетов-фактур действительно является проблемой, то вам необходимо проверить ее непосредственно перед ее выставлением. Если на счете-фактуре действительно нет элементов, то должна быть логика, которая гласит, что в этом счете-фактуре нет элементов с подробностями или что сумма равна нулю. Но если это из-за того, что между выдачей и получением квитанции он был оплачен, у вас все еще есть действующий счет.
Если вы говорите о двух вещах, обновляющих запись одновременно, то вам нужно использовать систему блокировки, чтобы гарантировать, что никакие другие записи процесса не будут выполняться, пока идет другая запись.
Для этого есть все виды параллельных подходов - например, система семефоров. У самого sql есть транзакции. Параллелизм Google SQL, распространенная проблема со многими решениями.
Общий шаблон: чтение, блокировка, чтение, запись и разблокировка.
Понимание управления параллелизмом
Нужно учитывать, хотите ли вы высокую производительность при чтении или записи. Используемая вами стратегия будет отражать это. Например, вы рассматриваете одно поле ... но как насчет обновления нескольких полей в одной строке?