Откатить перевод, если журнал отверг последний INSERT

Фактические данные получены через SQLSRV от отдельного SQL Server. Созданные программой учебные таблицы удалены после чтения.

Наблюдаемый результат программы
НаблюдениеРезультат
До отказа внутри транзакции8750 / 3750
Последний INSERT отклонёнда
Причина сохранена до rollbackда
Откат выполненда
После отката, счёт 110000
После отката, счёт 22500
Прежняя запись журнала сохраненада
Строки и дополнительные наблюдения
{
    "inside_before_failure": [
        {
            "id": 1,
            "balance_minor": 8750
        },
        {
            "id": 2,
            "balance_minor": 3750
        }
    ],
    "saved_diagnostic_codes": [
        {
            "SQLSTATE": "23000",
            "code": 2627
        },
        {
            "SQLSTATE": "01000",
            "code": 3621
        }
    ],
    "after_rollback": [
        {
            "id": 1,
            "balance_minor": 10000
        },
        {
            "id": 2,
            "balance_minor": 2500
        }
    ],
    "journal": [
        {
            "operation_id": "TX-150-BUSY",
            "amount_minor": 77
        }
    ]
}

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