Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+661новая вакансия за сутки·58 731вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 712
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 393 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python11 079
  • Облачные технологии8 824
  • QA вакансии2 977
  • Android1 395
  • Инженер данных1 032
  • Продакт-менеджер351

Разработка

  • Backend вакансии1 342
  • iOS1 307
  • AI вакансии660
  • Fullstack вакансии524
  • Frontend вакансии465
  • Mobile вакансии28

По стеку

  • Go6 622
  • Java3 670
  • Kotlin1 199
  • Node.js1 190
  • Rust1 181
  • .NET780
  • PHP329
  • C++301
  • C#211

DevOps и инфраструктура

  • Kubernetes5 251
  • Linux-инфраструктура4 138
  • DevOps вакансии3 024
  • Terraform / IaC2 834
  • Мониторинг и Observability1 406
  • CI/CD917
  • SRE389
  • Кибербезопасность40

Аналитика и данные

  • Аналитик данных586
  • Бизнес-аналитик487
  • Data Scientist458
  • Системный аналитик75

Другие направления

  • Проджект-менеджер114
  • UI/UX дизайн74
  • Ручное тестирование14

По регионам

  • Вакансии в США31 201
  • Вакансии в Европе11 507
  • Работа в России3 630
  • Вакансии в Канаде2 546

По формату

  • Удалённые вакансии47 761
  • Релокация в США31 201
  • Гибридная работа7 699
  • Офисная работа6 071

По уровню

  • Senior вакансии27 027
  • Middle вакансии12 284
  • Junior вакансии4 495

Сейчас нанимают

Все компании
  • Wise196 вакансий
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify38 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Spring FrameworkВсе вопросы
Spring FrameworkSeniorТеория

Что такое декларативное управление транзакциями в Spring и как работает @Transactional?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

@Transactional реализуется через AOP-прокси (JDK dynamic proxy или CGLIB): Spring перехватывает вызов метода через TransactionInterceptor, открывает транзакцию в PlatformTransactionManager и делает commit или rollback в зависимости от исхода.

Пример с propagation и rollbackFor

@Service
@Transactional(readOnly = true)   // все методы класса — read-only по умолчанию
public class OrderService {

    private final OrderRepository orderRepo;
    private final PaymentService paymentService;

    public OrderService(OrderRepository orderRepo, PaymentService paymentService) {
        this.orderRepo = orderRepo;
        this.paymentService = paymentService;
    }

    // Переопределяем на read-write + откат на любое исключение
    @Transactional(
        rollbackFor = Exception.class,
        isolation = Isolation.READ_COMMITTED,
        timeout = 30
    )
    public Order placeOrder(CreateOrderRequest req) throws PaymentException {
        Order order = orderRepo.save(new Order(req));
        // paymentService.charge работает в ОТДЕЛЬНОЙ транзакции
        paymentService.charge(order.getId(), req.getAmount());
        return order;
    }

    public List<Order> findByUser(Long userId) {
        // readOnly=true — Hibernate пропускает dirty check, выигрыш производительности
        return orderRepo.findByUserId(userId);
    }
}
@Service
public class PaymentService {

    private final PaymentRepository paymentRepo;

    // REQUIRES_NEW: всегда новая транзакция, независимо от вызывающей
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void charge(Long orderId, BigDecimal amount) throws PaymentException {
        Payment payment = new Payment(orderId, amount);
        paymentRepo.save(payment);
        // если выброшено исключение — откатится только эта транзакция
        gateway.process(payment);
    }
}

Как работает @Transactional

Когда Spring обнаруживает бин с методом, помеченным @Transactional, он создаёт AOP-прокси вокруг бина. При каждом вызове аннотированного метода управление сначала попадает в TransactionInterceptor, который взаимодействует с PlatformTransactionManager (или ReactiveTransactionManager для реактивного стека). Менеджер открывает новую транзакцию либо присоединяется к существующей в соответствии с propagation-стратегией. После выхода из метода: если исключений нет — commit(), если выброшено непроверяемое (RuntimeException) или явно указанное исключение — rollback().

Ключевые атрибуты аннотации

  • propagation — стратегия распространения транзакции: REQUIRED (по умолчанию), REQUIRES_NEW, NESTED, SUPPORTS, NOT_SUPPORTED, MANDATORY, NEVER.
  • isolation — уровень изоляции: DEFAULT, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE.
  • rollbackFor / noRollbackFor — классы исключений, управляющие rollback.
  • readOnly — подсказка для JPA/Hibernate: отключить dirty checking, использовать read-replica.
  • timeout — максимальное время транзакции в секундах.

Self-invocation: главная ловушка

Вызов @Transactional-метода из того же класса (self-invocation) минует прокси — транзакция не будет открыта. Решения: инжектировать бин в себя (@Autowired ApplicationContext или @Lazy-ссылка на себя), вынести метод в отдельный бин, либо включить AspectJ weaving вместо прокси-режима.

Настройка менеджера транзакций

@Configuration
@EnableTransactionManagement   // включает обработку @Transactional
public class DataConfig {

    @Bean
    public PlatformTransactionManager transactionManager(DataSource ds) {
        return new DataSourceTransactionManager(ds);
    }

    // Для JPA:
    // return new JpaTransactionManager(entityManagerFactory);
}

Подводные камни

  • Self-invocation: метод вызывает другой @Transactional-метод того же класса напрямую — прокси не задействован, транзакция не открывается.
  • Checked exceptions не откатывают по умолчанию: только RuntimeException и Error. Для проверяемых нужен rollbackFor = Exception.class.
  • private-методы игнорируются Spring AOP — аннотация на private void doSomething() не работает.
  • Транзакция на уровне контроллера: @Transactional в @RestController работает, но антипаттерн — HTTP-слой не должен управлять транзакциями; граница транзакции должна быть в сервисном слое.
  • LazyInitializationException: при использовании JPA с @Transactional(readOnly = true) ленивые коллекции доступны внутри метода, но после его завершения сессия закрыта.
  • NESTED propagation требует поддержки savepoint от JDBC-драйвера; не все БД и драйверы это поддерживают.
  • readOnly = true не гарантирует изоляции: это лишь подсказка для провайдера, реальная read-only изоляция зависит от БД.
  • Многопоточность: транзакция привязана к потоку через ThreadLocal (TransactionSynchronizationManager). Запуск задачи в новом потоке изнутри транзакции не распространяет её на новый поток.

Типичные ошибки

  • Путать термин «declarative transactions» с соседним механизмом Spring Framework.
  • Не называть границу lifecycle, transaction, thread или request для «declarative transactions».
  • Игнорировать production-эффекты «declarative transactions»: latency, SQL shape, memory, security или observability.

Что проверяет интервьюер

  • Попросить объяснить механизм «declarative transactions» на минимальном примере.
  • Проверить, видит ли кандидат failure mode и диагностику для «declarative transactions».
  • Уточнить, какие настройки или API меняют «declarative transactions» в реальном сервисе.

Как вы знаете этот вопрос?

Проверить себя по теме Spring Framework →

Источники

  • https://docs.spring.io/spring-framework/reference/data-access/transaction/declarative.html
←Предыдущий вопросЧто такое Dependency Injection (DI)? Какие типы DI существуют в Spring?Следующий вопрос→Какие production-риски есть у Spring Framework: blocking code, connection pooling, config, auth, observability, deploy или graceful shutdown?

Связанные темы

Spring Frameworkbackend-designpersistence-debugging

Частые вопросы на собеседовании

  • Что такое Spring Framework и какие проблемы он решает?
  • Что такое Spring Bean? Как IoC-контейнер Spring управляет бинами?
  • Что такое Spring MVC? Объясните жизненный цикл запроса в DispatcherServlet.
  • Что такое Inversion of Control (IoC) и как Spring его реализует?