Зарезервировать товар и отличить отсутствие остатка от ошибки SQL

Фактические данные получены через расширение interbase от отдельной локальной базы Firebird. Собственная учебная таблица удалена после наблюдений.

Наблюдаемый результат программы
НаблюдениеРезультат
Начальный остаток3
Запрошено в каждом резервировании2
Первый UPDATE вернул число 1да
Первый UPDATE: изменено строк1
Второй UPDATE вернул trueда
Второй UPDATE: изменено строк0
Остаток после двух запросов1
Второй запрос является ошибкой SQLнет
Строки и дополнительные наблюдения
{
    "initial_stock": 3,
    "quantity": 2,
    "first_return": 1,
    "first_affected": 1,
    "second_return": true,
    "second_affected": 0,
    "final_stock": 1,
    "conditional_update": true,
    "selection_of_all_rows": false,
    "separate_requests_committed": 2
}

Самостоятельный запуск создаёт result.json с данными и metrics.json с проверками рядом с example.php.