Изменение поведения транзакций только для чтения в Spring Boot 2.1.0 - PullRequest
0 голосов
/ 21 ноября 2018

При обновлении с 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);
    }

}

Хотя это новое поведение может быть правильным, оно нарушает существующее приложение без предварительного уведомления.Итак, мои вопросы:

  1. Правильно ли поведение?
  2. Можно ли настроить Spring таким образом, чтобы он вызывал исключение, если вы пытаетесь сохранить данные в транзакции только для чтения.
  3. Если поведение правильное, должен ли Spring проверить, вызываете ли вы метод с readonly = false из другого метода, который настроен как транзакция readOnly?
...