[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-kakie-urovni-propagation-sushchestvuyut":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},620,"kakie-urovni-propagation-sushchestvuyut",14,"spring","Spring","🌱","Какие уровни propagation существуют?","Propagation определяет, как метод с `@Transactional` ведёт себя относительно уже существующей транзакции.\n\n| Propagation | Описание |\n|-------------|----------|\n| REQUIRED (по умолчанию) | Если транзакция есть -- присоединиться. Если нет -- создать новую |\n| REQUIRES_NEW | Всегда создавать новую транзакцию, текущую приостановить |\n| SUPPORTS | Если транзакция есть -- присоединиться. Если нет -- без транзакции |\n| NOT_SUPPORTED | Выполнять без транзакции, текущую приостановить |\n| MANDATORY | Обязательно должна быть транзакция, иначе -- исключение |\n| NEVER | Обязательно НЕ должно быть транзакции, иначе -- исключение |\n| NESTED | Если есть транзакция -- создать вложенную (savepoint). Если нет -- как REQUIRED |\n\n\u003Cdetails>\n\u003Csummary>Пример: REQUIRED vs REQUIRES_NEW\u003C\u002Fsummary>\n\n```java\n@Service\npublic class OrderService {\n\n    @Transactional \u002F\u002F REQUIRED по умолчанию\n    public void createOrder(Order order) {\n        orderRepository.save(order);\n        paymentService.processPayment(order);  \u002F\u002F присоединится к той же транзакции\n        auditService.logAction(\"ORDER_CREATED\"); \u002F\u002F REQUIRES_NEW -- своя транзакция\n    }\n}\n\n@Service\npublic class PaymentService {\n    @Transactional(propagation = Propagation.REQUIRED)\n    public void processPayment(Order order) {\n        \u002F\u002F работает в той же транзакции, что и createOrder()\n        \u002F\u002F если здесь ошибка -- откатится ВСЯ транзакция, включая order\n    }\n}\n\n@Service\npublic class AuditService {\n    @Transactional(propagation = Propagation.REQUIRES_NEW)\n    public void logAction(String action) {\n        \u002F\u002F всегда в НОВОЙ транзакции\n        \u002F\u002F даже если основная транзакция откатится, лог сохранится\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### NESTED -- вложенные транзакции через savepoint\n\n```java\n@Transactional\npublic void processBatch(List\u003CItem> items) {\n    for (Item item : items) {\n        try {\n            itemService.processItem(item); \u002F\u002F NESTED\n        } catch (Exception e) {\n            \u002F\u002F откатится только обработка этого item (savepoint)\n        }\n    }\n}\n```\n\n> **На собеседовании:** ключевое -- разница между REQUIRED и REQUIRES_NEW. При REQUIRED ошибка внутреннего метода откатит всю внешнюю транзакцию. При REQUIRES_NEW -- только внутреннюю. Частая ошибка -- путать эти два типа.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":19,"keywords":20,"schemaAnswer":19,"featuredSnippetReady":21},"Какие уровни propagation существуют? — Gymterview","Propagation определяет, как метод с `@Transactional` ведёт себя относительно уже существующей транзакции.",[7,13],true]