При обновлении с Spring Boot 2.0.6 до 2.1.0 происходит изменение обработки флага readOnly.Приведенный ниже код успешно сохраняет клиента, а тот же код в 2.1.0 не сохраняетВ 2.1.0 метод save возвращает только ту же сущность Customer без заполненного столбца id.
Причина может быть связана с этим тикетом: https://jira.spring.io/browse/SPR-16956
@Service
@Transactional(readOnly = true)
public class CustomerService {
private final CustomerRepository customerRepository;
public CustomerService(CustomerRepository customerRepository) {
this.customerRepository = customerRepository;
}
public Customer save(Customer customer) {
return customerRepository.save(customer);
}
}
Также, если у вас естьодна служба, где для флага readOnly установлено значение true, которая вызывает другую службу, для которой для флага readOnly установлено значение false, данные не сохраняются.
@Service
@Transactional(readOnly = true)
public class FirstService {
private final SecondService secondService;
public Foo save(Foo foo) {
return secondService.save(foo);
}
}
@Service
@Transactional(readOnly = false)
public class FirstService {
private final SecondService secondService;
@Transactional(readOnly = false)
public Foo save(Foo foo) {
return secondService.save(foo);
}
}
Хотя это новое поведение может быть правильным, оно нарушает существующее приложение без предварительного уведомления.Итак, мои вопросы:
- Правильно ли поведение?
- Можно ли настроить Spring таким образом, чтобы он вызывал исключение, если вы пытаетесь сохранить данные в транзакции только для чтения.
- Если поведение правильное, должен ли Spring проверить, вызываете ли вы метод с readonly = false из другого метода, который настроен как транзакция readOnly?