Оптимистичная блокировка не работает, когда субъект извлекается в новую транзакциюJAVA

Программисты JAVA общаются здесь
Anonymous
Оптимистичная блокировка не работает, когда субъект извлекается в новую транзакцию

Сообщение Anonymous »

После миграции с Spring Boot с 2,7 до 3.3 у меня возникает проблема с оптимисткой блокировкой в ​​этом конкретном случае. Это не работает, когда я получаю объект из базы данных в новой транзакции.@Entity
class MyEntity{
@Id
long id;

@Version
Long version;
}

class A {
private B bService;

@Transactional(readOnly = true)
public void execute() {
try {
bService.begin(10);
} catch (OptimisticLockingFailureException e) {
log.... //this is never catch at spring 3.3
}
}

class B {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public MyEntity begin(Long id) {
MyEntity freshMyEntity = repository.findAwaiting(id)
.orElseThrow(EntityNotFoundException::new);

// at this moment another transaction commit entity with the same ID
// or when I pause this and commit it manualy in database
// both case increased version field
return repository.save(freshMyEntity);
}

блокировка работает, когда я удаляю извлечение объекта Repository.findawaiting и объект поступает в качестве метода начала параметра. Я что -то скучаю? Для меня это похоже на ошибку, я не прав? Это сохранение в методе начинается, должно выдвинуть исключение, потому что версия MyEntity уже была изменена другой транзакцией, но эта транзакция успешно завершена ... < /p>
return repository.save(freshMyEntity);


Подробнее здесь: https://stackoverflow.com/questions/794 ... ransaction

Вернуться в «JAVA»