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

+1 128новых вакансий за сутки·93 813вакансий открыто сейчас·Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 196
  • Облачные технологии14 160
  • QA вакансии3 451
  • Backend вакансии2 107
  • Инженер данных1 800
  • Продакт-менеджер1 247

Разработка

  • Android1 855
  • iOS1 695
  • Fullstack вакансии995
  • AI вакансии952
  • Frontend вакансии751
  • Mobile вакансии43

По стеку

  • Go8 754
  • Java6 595
  • Node.js2 038
  • .NET1 738
  • Kotlin1 617
  • Rust1 473
  • C#718
  • PHP692
  • C++582

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

  • Kubernetes7 778
  • DevOps вакансии6 088
  • Linux-инфраструктура5 502
  • Terraform / IaC4 276
  • CI/CD3 275
  • Мониторинг и Observability1 793
  • SRE563
  • Кибербезопасность453

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

  • Data Scientist1 141
  • Бизнес-аналитик921
  • Аналитик данных860
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США44 164
  • Вакансии в Европе24 016
  • Вакансии в Канаде4 533
  • Работа в России3 837

По формату

  • Удалённые вакансии75 134
  • Релокация в США44 163
  • Гибридная работа12 456
  • Офисная работа7 066

По уровню

  • Senior вакансии42 633
  • Middle вакансии20 971
  • Junior вакансии6 706

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

Все компании
  • Rakuten189 вакансий
  • Wise189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Что такое пессимистическая блокировка в Hibernate и когда её следует использовать?

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

Пессимистическая блокировка захватывает строку на уровне СУБД (SELECT FOR UPDATE) при чтении, предотвращая параллельные изменения. Используется когда конфликты вероятны или когда нельзя допустить потерянных обновлений (финансовые операции, инвентаризация).

Использование через EntityManager

@Transactional
public void transferFunds(Long fromId, Long toId, BigDecimal amount) {
    // Блокируем обе записи в предсказуемом порядке (избегаем deadlock)
    Long first = Math.min(fromId, toId);
    Long second = Math.max(fromId, toId);

    BankAccount from = em.find(
        BankAccount.class, first,
        LockModeType.PESSIMISTIC_WRITE
    );
    BankAccount to = em.find(
        BankAccount.class, second,
        LockModeType.PESSIMISTIC_WRITE
    );

    if (from.getId().equals(toId)) {
        BankAccount tmp = from; from = to; to = tmp;
    }

    from.debit(amount);
    to.credit(amount);
    // Блокировки освобождаются при коммите транзакции
}

Концепция пессимистической блокировки

Пессимистическая блокировка исходит из того, что конфликты вероятны, и блокирует ресурс немедленно при чтении. СУБД выполняет SELECT ... FOR UPDATE (или FOR SHARE), удерживая row-level lock до завершения транзакции. Другие транзакции не могут изменить заблокированные строки, пока транзакция не зафиксируется или откатится.

Применяется когда: бизнес-логика требует гарантии, что данные не изменятся между чтением и записью; конфликты часты; retry невозможен или дорог; операция финансовая и нет права на ошибку.

LockModeType в JPA

JPA определяет несколько режимов блокировки через jakarta.persistence.LockModeType:

  • PESSIMISTIC_READ — shared lock (SELECT FOR SHARE), другие читают, но не пишут.
  • PESSIMISTIC_WRITE — exclusive lock (SELECT FOR UPDATE), другие не читают и не пишут.
  • PESSIMISTIC_FORCE_INCREMENT — exclusive lock + инкремент @Version, если она есть.

Использование через Spring Data JPA

public interface InventoryRepository extends JpaRepository<Inventory, Long> {

    @Lock(LockModeType.PESSIMISTIC_WRITE)
    @Query("SELECT i FROM Inventory i WHERE i.productId = :productId")
    Optional<Inventory> findByProductIdForUpdate(@Param("productId") Long productId);

    @Lock(LockModeType.PESSIMISTIC_WRITE)
    @QueryHints(@QueryHint(name = "javax.persistence.lock.timeout", value = "3000"))
    Optional<Inventory> findById(Long id); // Override базового метода с блокировкой
}

Timeout для блокировки

Важно всегда устанавливать timeout, чтобы избежать бесконечного ожидания. В PostgreSQL это lock_timeout:

Map<String, Object> hints = new HashMap<>();
hints.put("jakarta.persistence.lock.timeout", 5000); // 5 секунд
Product product = em.find(Product.class, productId, LockModeType.PESSIMISTIC_WRITE, hints);

Через JPQL с hint:

TypedQuery<Seat> query = em.createQuery(
    "SELECT s FROM Seat s WHERE s.flightId = :fid AND s.status = 'AVAILABLE'",
    Seat.class
);
query.setParameter("fid", flightId);
query.setMaxResults(1);
query.setLockMode(LockModeType.PESSIMISTIC_WRITE);
query.setHint("jakarta.persistence.lock.timeout", 3000);
Seat seat = query.getSingleResult();

SELECT FOR UPDATE SKIP LOCKED

Для реализации очередей задач (job queue) PostgreSQL поддерживает SKIP LOCKED — пропустить уже заблокированные строки. Через нативный запрос:

@Query(value = "SELECT * FROM tasks WHERE status = 'PENDING' LIMIT 1 FOR UPDATE SKIP LOCKED",
       nativeQuery = true)
@Lock(LockModeType.PESSIMISTIC_WRITE)
Optional<Task> findNextPendingTask();

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

  • Deadlock возможен если две транзакции блокируют строки в разном порядке. Решение: всегда блокировать строки в одном детерминированном порядке (например, по ID по возрастанию).
  • Пессимистическая блокировка не работает корректно без транзакции — @Transactional обязателен, иначе lock снимается сразу после SELECT.
  • Длинные транзакции с пессимистическими блокировками создают высокое lock-contention — избегайте операций ввода-вывода (HTTP-вызовы, файловые операции) внутри заблокированной транзакции.
  • В кластере с несколькими репликами чтения пессимистические блокировки работают только на мастере — убедитесь, что запрос направлен на primary.
  • Hint jakarta.persistence.lock.timeout=0 означает NOWAIT (немедленно выбросить исключение если lock недоступен) — не означает отключение timeout.
  • При использовании connection pool блокировка держит соединение до конца транзакции — при высоком параллелизме это быстро исчерпывает пул соединений.
  • Hibernate может делать дополнительный SELECT для получения блокировки на уже загруженную в L1-кэш сущность — при необходимости используйте em.refresh(entity, LockModeType.PESSIMISTIC_WRITE).

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

  • Что такое проблема N+1 в Hibernate и как её решить?
  • Что такое lazy loading в Hibernate и когда возникает LazyInitializationException?
  • В чём разница между SessionFactory и Session в Hibernate?
  • Что такое Hibernate и что такое ORM (Object-Relational Mapping)?

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

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

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

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

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

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

Источники

  • https://jakarta.ee/specifications/persistence/3.2/jakarta-persistence-spec-3.2
←Предыдущий вопросЧто такое аннотация `@Inheritance` и какие стратегии наследования поддерживает Hibernate (SINGLE_TABLE, TABLE_PER_CLASS, JOINED)?Следующий вопрос→Как настроить кэш второго уровня в Hibernate? Назовите несколько провайдеров кэша.

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

Hibernatearchitecture-tradeoffsconcurrency-debuggingproduction-readiness