Spring Boot 2.1.0只读事务行为更改

时间:2018-11-21 19:21:00

标签: java spring hibernate spring-boot spring-transactions

从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事务的方法中调用带有“ readonly = false”的方法?

0 个答案:

没有答案