Skip to content

HWs - #4

Open
StarostinLF wants to merge 9 commits into
L1mple:mainfrom
StarostinLF:main
Open

HWs#4
StarostinLF wants to merge 9 commits into
L1mple:mainfrom
StarostinLF:main

Conversation

@StarostinLF

@StarostinLF StarostinLF commented Sep 20, 2026 •

Copy link
Copy Markdown

Что сделано

HW 1

  • реализована обработка HTTP-запросов в application (чистый ASGI, без фреймворков);
  • /factorial?n= — вычисление факториала;
  • /fibonacci/<n> — вычисление числа Фибоначчи;
  • /mean — среднее по списку чисел из JSON-тела;
  • прочие пути/методы → 404, некорректный формат параметров → 422, некорректное значение (например, отрицательное число или пустой список) → 400.

HW 2

  • реализован REST API интернет-магазина: cart (создание, получение по id, список с фильтрами, добавление товара) и item (создание, получение по id, список с фильтрами, полная и частичная замена, удаление);
  • цена корзины считается на лету из актуальных цен товаров.

Lecture 3 (HW 3)

  • сервис магазина из HW 2 собирается в Docker-образ (lecture3/Dockerfile);
  • docker-compose.yml поднимает сервис, Prometheus и Grafana;
  • метрики сервиса отдаются на /metrics через prometheus-fastapi-instrumentator, Prometheus собирает их каждые 10 секунд;
  • в Grafana собран дашборд с запросами в секунду и средним временем ответа (скриншот ниже).

Lecture 4 (HW 4)

  1. БД в docker-compose: в lecture4/docker-compose.yml добавлен сервис mysql (MySQL 8, порт 3307). MySQL выбран, потому что в Postgres READ UNCOMMITTED работает как READ COMMITTED, и dirty read там не показать.
  2. Хранение данных в БД: магазин из HW 2 переписан на SQLAlchemy (lecture4/hw/shop_api/main.py), вместо словарей в памяти используются таблицы shop_items, shop_carts, shop_cart_items. Тесты из HW 2 проходят.
  3. Уровни изоляции транзакций: скрипт lecture4/hw/isolation.py открывает два соединения (A и B) с нужным уровнем изоляции и показывает каждую аномалию:
№ Уровень Что показано
1 READ UNCOMMITTED dirty read есть
2 READ COMMITTED dirty read нет
3 READ COMMITTED non-repeatable read есть
4 REPEATABLE READ non-repeatable read нет
5 REPEATABLE READ phantom read есть (после UPDATE в COUNT появляется строка, вставленная B)
6 SERIALIZABLE phantom read нет (B не может вставить строку, пока A не закончил)

Запуск: docker compose up -d mysql, затем cd hw && pip install -r requirements.txt && python isolation.py (проверено в GitHub Codespaces).

Вывод скрипта:

1. Dirty read есть при READ UNCOMMITTED
READ UNCOMMITTED: B видит баланс 0 (A ещё не сделал commit, было 100)

2. Dirty read нет при READ COMMITTED
READ COMMITTED: B видит баланс 100 (A ещё не сделал commit, было 100)

3. Non-repeatable read есть при READ COMMITTED
READ COMMITTED: A читает баланс 100
READ COMMITTED: A читает снова 500 (B поменял на 500 и сделал commit)

4. Non-repeatable read нет при REPEATABLE READ
REPEATABLE READ: A читает баланс 100
REPEATABLE READ: A читает снова 100 (B поменял на 500 и сделал commit)

5. Phantom read есть при REPEATABLE READ
REPEATABLE READ: A считает строки: 2
REPEATABLE READ: A считает снова: 2 (B добавил строку и сделал commit)
REPEATABLE READ: A обновил все строки и считает: 3

6. Phantom read нет при SERIALIZABLE
SERIALIZABLE: A считает строки: 2
SERIALIZABLE: B не смог вставить строку, пока A не закончил (фантома нет)
SERIALIZABLE: A считает снова: 2

@DevDenus DevDenus left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Хорошая реализация, молодец!

Comment thread hw1/app.py
return

if path == "/mean":
message = await receive()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

вход может прийти в несколько пакетов с more_body=True, в рамках этого дз некритично

@StarostinLF

Copy link
Copy Markdown
Author
Снимок экрана 2026-10-05 180016

@StarostinLF StarostinLF changed the title Implement ASGI application with fibonacci, factorial, and mean endpoints HWs Oct 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants