2015-05-24 2 views
1

У меня есть два вопроса относительно пессимистического LockModes, которые доступны в спящем 3.3.2.ga:Hibernate LockMode релиз и не-быстро, если блокировка не может быть приобретена

  1. Если я заблокировать набор строк, используя lockmode UPGRADE, блокируются ли блокировки при выходе из области транзакции? Если да, можем ли мы заблокировать-разблокировать транзакции?

  2. Для следующего сценария, который LockMode бы полезно

    • Thread 1, пытается получить блокировку и блокирует набор строк

    • темы 2, пытается получить блокировку тот же набор строк (как заперли Нитями 1) в это время поток 2 получает исключение говорят, что ряды заблокированы

    Какой бы лучший ре ssimistic LockMode?

+0

Это ваша сегодняшняя домашняя работа? – bish

+0

Отсутствие bish, обрабатывая случай использования дела. :) –

ответ

1
  1. LockMode.UPGRADE использует select ... for update, так что блокировки удерживаются the whole duration of the current transaction. Единственный способ освободить блокировки - это либо совершить, либо отменить транзакцию.

  2. A select ... for update блокировка заставит вторую транзакцию дождаться, пока первый из них выйдет из замка. Если вы хотите быстро выйти из строя, вам необходимо использовать: UPGRADE_NOWAIT, который будет использовать запрос select ... for update no wait, который генерирует исключение, если блокировка не может быть получена (это поддерживается Oracle и PostgreSQL).

  3. Или, вы можете использовать Hibernate LockOptions следующим образом:

    entityManager 
    .unwrap(Session.class) 
    .buildLockRequest(
        new LockOptions(LockMode.PESSIMISTIC_WRITE) 
        .setTimeOut(LockOptions.NO_WAIT)) 
    .lock(entity); 
    

Для получения более подробной информации, проверьте мой Transactions and Concurrency Control presentation из Voxxed дней Цюрих.

+0

Спасибо Владу, пытался реализовать пессимистическую блокировку без условия ожидания в MySQL, но не представляется возможным. Придется идти с оптимистичной стратегией проверки версий. –

Смежные вопросы