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

+1 088новых вакансий за сутки·80 376вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python14 930
  • Облачные технологии11 512
  • QA вакансии3 347
  • Backend вакансии1 791
  • Инженер данных1 397
  • Продакт-менеджер842

Разработка

  • Android1 731
  • iOS1 605
  • AI вакансии858
  • Fullstack вакансии725
  • Frontend вакансии617
  • Mobile вакансии31

По стеку

  • Go8 182
  • Java5 283
  • Node.js1 704
  • Kotlin1 419
  • Rust1 360
  • .NET1 290
  • PHP551
  • C++394
  • C#369

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

  • Kubernetes6 474
  • Linux-инфраструктура4 834
  • DevOps вакансии4 737
  • Terraform / IaC3 590
  • Мониторинг и Observability1 636
  • CI/CD1 541
  • SRE504
  • Кибербезопасность245

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

  • Data Scientist769
  • Аналитик данных748
  • Бизнес-аналитик722
  • Системный аналитик94

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

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

По регионам

  • Вакансии в США40 526
  • Вакансии в Европе16 981
  • Вакансии в Канаде3 889
  • Работа в России3 872

По формату

  • Удалённые вакансии64 846
  • Релокация в США40 528
  • Гибридная работа9 711
  • Офисная работа6 552

По уровню

  • Senior вакансии35 880
  • Middle вакансии17 118
  • Junior вакансии5 838

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

Все компании
  • Wise193 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • 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 его реализует?