Мы используем Spring 4.x и Spring Data JPA с декларативным управлением транзакциями, у меня есть контроллер, служба и репозиторий, например, под псевдокодом.Весеннее декларативное управление транзакциями и обработка отката
@Service
@Transactional(readOnly=true)
public class SampleService {
@Autowired
private SampleRepository sampleRepository;
@Transactional
public MyEntity saveMyEntity(MyEntity entity) {
//do some business logic
return sampleRepository.save(entity);
}
}
public class SampleController {
@Autowired
private SampleService sampleService;
public String saveSample(@Valid MyEntity entity) {
//Validation
//If Valid
sampleService.saveMyEntity(entity);
//After saving do some view related rendering logic
//Assume here view related rendering logic throws Exception
return "view"
}
}
В приведенном выше коде ошибка выкинут после вызова sampleService.saveMyEntity (лица);, но транзакция не отмечена для отката, поэтому конечный пользователь получит страницу с ошибкой, но за объектом сцены сохраняется.
Есть ли способ отменить транзакцию?
Возможно, этот может вам помочь: http://stackoverflow.com/questions/16167278/spring-transaction-doesnt-rollback – Teo
@Teo спасибо, но не совсем такая же проблема, здесь метод sampleService.saveMyEntity возвращается без каких-либо исключений , Здесь исключение происходит после этого вызова службы и внутри моего контроллера. – Nick
Сделка совершается после завершения сохранения saveMyEntity(). После этого нельзя откат. Вам нужно будет расширить сферу транзакции, чтобы включить дополнительную логику. –