Например, когда вы используете @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;
}
}
Если вам необходимо применить пессимистичный, оптимистический или их комбинацию в коде доступа к данным вашего метода, это становится конкретной потребностью, а не обобщением.