【问题标题】:Spring @Transactional read-only mode rollback behaviourSpring @Transactional 只读模式回滚行为
【发布时间】:2017-09-30 06:09:15
【问题描述】:

我有一些@Transactional(readOnly=true) 的服务层方法,这种方法经常导致一些RuntimeException(假设它是一些NotFoundException 异常)。

我也将 ORM Hibernate 用于 DB 交互过程。

这样做是否合法?

在这种情况下,“回滚”行为的默认行为是什么?它会以某种方式严重影响连接的状态或导致任何问题吗?


这不是“为什么不自己尝试一下?”之类的东西。我怀疑这可能在发生一些异常后导致同一方法中出现Transaction rolled back because it has been marked as rollback-only 错误。这可能是非常具体的 JDBC PostgreSQL 驱动程序错误。这就是为什么我总体上对这种设计感到疑惑:这样做是合法的还是非法的?

【问题讨论】:

  • 没有关于回滚和在那里抛出运行时异常
  • @Andremoniy 感谢接受,老实说我不记得写过这篇文章,现在读完之后,我什么都不记得了)))可能需要刷新

标签: java spring postgresql hibernate transactions


【解决方案1】:

据我了解,您担心回滚。在这种情况下,readOnlyselect statement,通常没有什么可以从read 回滚。唯一方便的地方是当您在锁下阅读并且事务完成时释放该锁。

AFAIK readOnly 会将刷新模式设置为 FlushMode.NEVER,这同时是好是坏。很好,因为不会有脏检查,如here 所述。不好,因为如果您在 readOnly 事务中调用 read/write 事务,事务将静默提交失败,因为会话未刷新。顺便说一句,这很容易测试 - 我希望自从我尝试过之后事情没有改变。

然后是连接池。我知道C3P0 的默认策略是回滚任何未提交的工作。控制它的标志是autoCommitOnClose

然后是关于readOnlypostgresthis link - 我没有使用过,也无法真正说出我的意见。

现在谈谈Transaction rolled back because it has been marked as rollback-only。对于readOnly 事务,正如我之前所说,可能没有什么可以回滚的,所以这真的取决于你如何链接你的@Transactional 方法IMO。

【讨论】:

    【解决方案2】:

    我遇到了和作者描述的一样的情况(UnexpectedRollbackException)。 我做了一些研究,例如更改传播或 noRollbackFor,但它仍然不起作用。 最后,我找到了解决方法。创建一个继承 Exception(已检查异常)的自定义异常(例如 NotExistedException)。 然后对于调用者,它决定捕获或抛出运行时异常。 请参阅下面的代码。

    @Transactional(readOnly = true)
    public obj selectSth(String id) throws NotExistedException {
        obj = xxxDao.selectSth(id);
        if (obj == null)
            throw new NotExistedException('not found');
        else
            return obj ;
    }
    
    // caller
    try {
        obj = xxxServ.selectSth('xx');
    } catch (NotExistedException e) { // checked exception
        // do nothing or throw below exception
        throw new NotFoundException(e.getMessage()); // not checked (runtime) exception
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-14
      • 2010-12-09
      • 2020-06-12
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      相关资源
      最近更新 更多