{"id":22521585,"url":"https://github.com/maxbarsukov-itmo/information-systems-labs","last_synced_at":"2026-04-16T18:02:13.309Z","repository":{"id":258382427,"uuid":"867332348","full_name":"maxbarsukov-itmo/information-systems-labs","owner":"maxbarsukov-itmo","description":"👩🏻‍💻ℹ Информационные системы: Лабораторные работы №1, №2, №3","archived":false,"fork":false,"pushed_at":"2024-12-15T12:48:01.000Z","size":8456,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-02-02T04:41:16.305Z","etag":null,"topics":["information-systems","itmo","java","laboratory-work","maxbarsukov","pmpknu","spring-boot"],"latest_commit_sha":null,"homepage":"https://se.ifmo.ru/courses/is","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maxbarsukov-itmo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-03T21:30:34.000Z","updated_at":"2024-12-15T12:52:00.000Z","dependencies_parsed_at":"2024-11-01T13:32:35.678Z","dependency_job_id":"e35ca11c-3151-49d8-8293-5488f27533ed","html_url":"https://github.com/maxbarsukov-itmo/information-systems-labs","commit_stats":null,"previous_names":["maxbarsukov-itmo/information-systems-1","maxbarsukov-itmo/information-systems-labs"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxbarsukov-itmo%2Finformation-systems-labs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxbarsukov-itmo%2Finformation-systems-labs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxbarsukov-itmo%2Finformation-systems-labs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxbarsukov-itmo%2Finformation-systems-labs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxbarsukov-itmo","download_url":"https://codeload.github.com/maxbarsukov-itmo/information-systems-labs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245962844,"owners_count":20701187,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["information-systems","itmo","java","laboratory-work","maxbarsukov","pmpknu","spring-boot"],"created_at":"2024-12-07T05:12:05.665Z","updated_at":"2026-04-16T18:02:08.239Z","avatar_url":"https://github.com/maxbarsukov-itmo.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Лабораторная работа 3\n\n## Вариант `331501`\n\n\u003cimg alt=\"anime\" src=\"./.resources/anime.gif\" height=\"300\"\u003e\n\n\u003e There are only two hard problems in two-phase distributed transactions: \\\n\u003e 2\\. Exactly-once delivery \\\n\u003e 1\\. Guaranteed order of messages \\\n\u003e 2\\. Exactly-once delivery\n\n[![Made with: Spring](https://img.shields.io/badge/Spring-white?style=for-the-badge\u0026logo=spring\u0026logoColor=6DB33F)](https://spring.io/)\n[![Made with: Spring Boot](https://img.shields.io/badge/Spring%20Boot-white?style=for-the-badge\u0026logo=springboot\u0026logoColor=6DB33F)](https://spring.io/projects/spring-boot)\n[![Made with: Spring Security](https://img.shields.io/badge/Spring%20Security-white?style=for-the-badge\u0026logo=springsecurity\u0026logoColor=6DB33F)](https://spring.io/projects/spring-security) \\\n[![Made with: Java](https://img.shields.io/badge/Java-176579?style=for-the-badge\u0026logo=coffeescript\u0026logoColor=E78A2A)](https://www.java.com)\n[![Made with: MinIO](https://img.shields.io/badge/MinIO-C72E49?style=for-the-badge\u0026logo=minio\u0026logoColor=white)](https://min.io/)\n[![Made with: Flyway](https://img.shields.io/badge/Flyway-CC0000?style=for-the-badge\u0026logo=flyway\u0026logoColor=white)](https://www.red-gate.com/products/flyway/) \\\n[![Made with: PostgreSQL](https://img.shields.io/badge/PostgreSQL-4169E1?style=for-the-badge\u0026logo=postgresql\u0026logoColor=white)](https://www.postgresql.org/)\n[![Made with: Docker](https://img.shields.io/badge/docker-2496ED?style=for-the-badge\u0026logo=docker\u0026logoColor=white)](https://www.docker.com/) \\\n[![Made with: React](https://img.shields.io/badge/React-61DAFB?style=for-the-badge\u0026logo=react\u0026logoColor=23272f)](https://react.dev/)\n[![Made with: Redux](https://img.shields.io/badge/Redux-764ABC?style=for-the-badge\u0026logo=redux\u0026logoColor=white)](https://redux.js.org/)\n[![Made with: MUI](https://img.shields.io/badge/MUI-007FFF?style=for-the-badge\u0026logo=mui\u0026logoColor=white)](https://mui.com/)\n[![Made with: JSS](https://img.shields.io/badge/JSS-F7DF1E?style=for-the-badge\u0026logo=jss\u0026logoColor=black)](https://cssinjs.org/?v=v10.10.1)\n\n|.pdf|.docx|\n|-|-|\n| [report](./docs/report.pdf) | [report](./docs/report.docx) |\n\n---\n\n### Команда\n\n- **Группа:** `P3315`\n- **Студенты:**\n  - [@maxbarsukov](https://github.com/maxbarsukov): Барсуков Максим Андреевич `367081`;\n  - [@pmpknu](https://github.com/pmpknu): Горляков Даниил Петрович `367165`.\n\n\n### Задание\n\n* [Текст задания](./docs/task.png) с [_se.ifmo.ru_](https://se.ifmo.ru/courses/is).\n\nДоработать ИС из [`ЛР2`](https://github.com/maxbarsukov-itmo/information-systems-labs/tree/lab-2) следующим образом:\n\n- Реализовать сохранение загруженных на сервер файлов, используемых для импорта данных, в файловом хранилище `MinIO` (можно взять любое другое *S3-совместимое хранилище*). Поднять и настроить `MinIO` требуется самостоятельно. Загруженные файлы должны быть доступны для скачивания из таблицы с логом импорта.\n- Сохранение загруженных файлов в файловом хранилище должно быть реализовано **транзакционно по отношению к операциям**, реализующим непосредственную вставку объектов в БД при импорте.\n- Для реализации распределенной транзакции из пункта 2 разрешается использовать любые инструменты. Рекомендуется решать задачу при помощи собственной реализации двух фазного коммита.\n- Необходимо на защите быть готовым продемонстрировать корректность реализованной распределенной транзакции в следующих условиях:\n  - **отказ файлового хранилища** (БД продолжает работать)\n  - **отказ БД** (файловое хранилище продолжает работать)\n  - **ошибка в бизнес-логике сервера** (работают и БД, и файловое хранилище, однако в коде сервера вылетает `RuntimeException` между запросами в разные источники данных)\n- Необходимо на защите быть готовым продемонстрировать корректность работы распределенной транзакции в условиях параллельных запросов от нескольких пользователей (реализованный в [`ЛР2`](https://github.com/maxbarsukov-itmo/information-systems-labs/tree/lab-2) сценарий для `Apache JMeter`, тестирующий функцию импорта, должен продолжать корректно отрабатывать).\n\n### Содержание отчёта:\n\n1. Текст задания.\n2. UML-диаграммы классов и пакетов разработанного приложения.\n3. Исходный код системы или ссылка на репозиторий с исходным кодом.\n4. Выводы по работе.\n\n### Вопросы к защите лабораторной работы:\n\n1. `Java Transaction API`. Основные принципы и программные интерфейсы. Работа с `JTA` в приложениях на базе `Spring`.\n2. Двухфазная фиксация в распределенных транзакциях (**two-phase commit protocol**).\n3. **Распределенные транзакции**, спецификация XA. Реализация в приложениях на базе `Jakarta EE` и `Spring`.\n4. **Менеджеры транзакций**. Использование менеджера транзакций в приложениях на базе `Spring`.\n\n### Как запустить?\n\nЭкспорт переменных окружения:\n\n    export $(cat .env | xargs)\n\nБаза данных и MinIO:\n\n    docker compose up\n\nЗапуск **back-end**:\n\n    ./gradlew bootRun\n\nЗапуск **front-end**:\n\n    cd frontend\n    yarn install\n    yarn start\n\n## Лицензия \u003ca name=\"license\"\u003e\u003c/a\u003e\n\nПроект доступен с открытым исходным кодом на условиях [Лицензии MIT](https://opensource.org/licenses/MIT). \\\n*Авторские права 2024 Max Barsukov*\n\n**Поставьте звезду :star:, если вы нашли этот проект полезным.**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxbarsukov-itmo%2Finformation-systems-labs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxbarsukov-itmo%2Finformation-systems-labs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxbarsukov-itmo%2Finformation-systems-labs/lists"}