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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 126
  • Облачные технологии14 083
  • QA вакансии3 456
  • Backend вакансии2 115
  • Инженер данных1 809
  • Продакт-менеджер1 261

Разработка

  • Android1 862
  • iOS1 700
  • Fullstack вакансии986
  • AI вакансии950
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 688
  • Java6 537
  • Node.js2 026
  • .NET1 722
  • Kotlin1 611
  • Rust1 458
  • C#710
  • PHP682
  • C++571

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

  • Kubernetes7 772
  • DevOps вакансии6 054
  • Linux-инфраструктура5 493
  • Terraform / IaC4 275
  • CI/CD3 239
  • Мониторинг и Observability1 790
  • SRE568
  • Кибербезопасность458

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

  • Data Scientist1 143
  • Бизнес-аналитик923
  • Аналитик данных857
  • Системный аналитик152

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

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

По регионам

  • Вакансии в США44 276
  • Вакансии в Европе23 819
  • Вакансии в Канаде4 471
  • Работа в России3 904

По формату

  • Удалённые вакансии74 928
  • Релокация в США44 273
  • Гибридная работа12 388
  • Офисная работа7 083

По уровню

  • Senior вакансии42 625
  • Middle вакансии20 854
  • Junior вакансии6 721

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 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