【问题标题】:What's the difference between readOnly=true and TransactionType Never?readOnly=true 和 TransactionType Never 有什么区别?
【发布时间】:2018-12-27 09:18:47
【问题描述】:

我正在使用 Spring 来处理我的事务。实际上,我看到了一个示例,其中我们有一个使用默认事务方面 @RequiredNew 和 readOnly=true 在表上查找的方法。

    @Override
    @Transactional(readOnly = true)
    public E findAll(E entity) {
        return repository.save(entity);
    }

我的问题是为什么不这样做,有什么区别?

@Transactional(propagation = Propagation.NEVER)
    @Override
    public Iterable<E> findAll() {
        return repository.findAll();
    }

【问题讨论】:

  • javadoc 是怎么说的?你读过吗?没有任何代码 sn-ps 有意义。
  • 对于事务从不它说执行非事务性。对于只读它说一个布尔标志,如果事务是*有效只读的,可以设置为 {@code true}。我在问什么是关于性能问题。
  • 性能无关紧要。代码 sn-ps 没有任何意义。从编写正确的代码开始。然后当你有一些正常工作时,看看你是否有性能问题。然后,如果你有一个,测量以确保它来自哪里。然后想知道如何使特定部分更快。
  • 我的问题是假设我有一个对数据库的 findAll 请求,例如,最好使用 readOnly=true 或使该方法成为非事务性方法?就这么简单。
  • 您需要一个事务才能使用 JPA。故事结局。如果您的 findAll 方法确实是只读的(即它实际上会找到实体并且不会像在您的代码中那样保存任何内容),那么您可以使用 readOnly。

标签: java spring spring-boot transactions


【解决方案1】:

readOnly 属性告诉 Hibernate 和您的数据库您不希望提交任何可能的更改。这会在当前休眠会话中设置FlushMode.NEVER。即使您调用save() 方法,您的数据库也不会发生任何更改。

Propagation.NEVER 表示 Spring 将执行操作非事务性,如果事务存在则抛出异常。这样可以确保不会创建任何事务。

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Propagation.html

【讨论】:

    猜你喜欢
    • 2017-11-08
    • 2013-07-29
    • 1970-01-01
    • 2021-05-13
    • 2012-05-03
    • 1970-01-01
    • 2011-06-22
    • 2018-12-20
    • 2023-03-14
    相关资源
    最近更新 更多