Hibernate / Spring: пессимист против блокировки оптимистов? - PullRequest
0 голосов
/ 11 мая 2018

Я не совсем понимаю, что такое блокировка и транзакция при использовании инструмента ORM, такого как Hibernate (со средой Spring).

Например, когда вы используете @Transactional и указываете уровень изоляции, означает ли это, что вы используете пессимистическую блокировку?

Можете ли вы одновременно использовать пессимистическую и оптимистическую блокировки? Я слышал, что оптимистическая блокировка обычно лучше, но я не нашел много проектов с @Version и т. Д. В большинстве случаев я всегда вижу аннотацию @Transaction Spring, используемую для управления транзакциями.

Спасибо

1 Ответ

0 голосов
/ 11 мая 2018

Например, когда вы используете @Transactional и указываете уровень изоляции, означает ли это, что вы используете пессимистическую блокировку?

Не обязательно.

Вы можете указать метод для грязного чтения , указав изоляцию как READ UNCOMMITTED, и если другая транзакция изменила, но еще не зафиксировала строку, которую читает ваш метод, вы в основном вернете измененные, но еще не зафиксированные значения. Это связано с тем, что на этом уровне изоляции общие блокировки чтения не создаются во время чтения. Короче говоря, этот метод выполняет базовое чтение, не заботясь о блокировке.

Можете ли вы одновременно использовать пессимистическую и оптимистическую блокировки?

Абсолютно.

Вы можете попросить Hibernate применить пессимистическую блокировку к сущности, которая содержит поле @Version, если ваш сценарий использования требует, чтобы вам было нужно такое поведение.

Я слышал, что оптимистическая блокировка обычно лучше, но я не нашел много проектов с @Version и т. Д. ... В большинстве случаев я всегда вижу аннотацию @Transaction Spring, используемую для управления транзакциями.

Я скажу, что в Интернете полно тривиальных примеров, которые не учитывают всех внутренних потребностей согласованности данных в сложном приложении. Эти примеры предназначены, главным образом, для иллюстрации того, что следующее предпочтение по сравнению с его аналогом

@Transactional
public void doSomeSpecialThing() {
  // do your thing here
}

против

public void doSomeSpecialThing() {
  entityManager.getTransaction().begin();
  try {
    // do your thing here
    entityManager.getTransaction().commit();
  }
  catch ( Exception e ) {
    if ( entityManager.getTransaction().isActive() ) {
      entityManager.getTransaction().rollback();
    }
    throw e;
  }
}

Если вам необходимо применить пессимистичный, оптимистический или их комбинацию в коде доступа к данным вашего метода, это становится конкретной потребностью, а не обобщением.

...