Отдать последнюю лампу одному покупателю

Ответы получены от MySQL через X Protocol. Учебные коллекции после чтения удалены.

Наблюдаемый результат программы
НаблюдениеРезультат
Остаток в первом защищённом чтении1
Обычное чтение второго сеанса1
Второй получил NOWAIT-конфликтда
После commit первый резерв существуетда
Второй заново прочитал остаток0
Подтверждено резервов1
Итоговый остаток0
Документы и дополнительные наблюдения
{
    "first_locked_read": {
        "_id": "LED-1",
        "kind": "product",
        "stock": 1
    },
    "ordinary_read": {
        "_id": "LED-1",
        "kind": "product",
        "stock": 1
    },
    "nowait_exception_chain": [
        {
            "class": "mysql_xdevapi\\Exception",
            "code": 10000,
            "message": "[HY000] Couldn't fetch data"
        },
        {
            "class": "mysql_xdevapi\\Exception",
            "code": 3572,
            "message": "[HY000] Statement aborted because lock(s) could not be acquired immediately and NOWAIT is set."
        }
    ],
    "second_locked_read_after_commit": {
        "_id": "LED-1",
        "kind": "product",
        "stock": 0
    },
    "saved_product": {
        "_id": "LED-1",
        "kind": "product",
        "stock": 0
    },
    "saved_reservations": [
        {
            "_id": "RES-A",
            "qty": 1,
            "owner": "A"
        }
    ]
}

Полный JSON результата, включая реальные идентификаторы, сохранён рядом в result.json.