Spring @Transactional只读模式回滚行为

And*_*niy 5 java postgresql spring hibernate transactions

我有一些服务层方法,@Transactional(readOnly=true)这种方法RuntimeException经常引起某些情况(假设这是一个NotFoundException例外)。

我还将ORM Hibernate用于数据库交互过程。

这样做是合法的吗?

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


它不是“为什么不自己尝试?”。我怀疑这可能会导致Transaction rolled back because it has been marked as rollback-only在某些例外情况下以相同的方法产生错误。这可能是非常特定的JDBC PostgreSQL驱动程序错误。这就是为什么我通常会对这种设计感到疑惑:这样做是合法的还是非法的?

Eug*_*ene 4

据我了解,您担心的是回滚。在这种情况下, areadOnly是 aselect statement并且通常没有任何内容可以从 a 回滚read。唯一方便的地方是当您在锁定下读取数据时,并且当事务完成时释放该锁定。

据我所知,readOnly将冲洗模式设置为FlushMode.NEVER,这同时是好是坏。很好,因为不会出现脏检查,如此处所述。不好的是,如果您在事务中调用读/写 事务readOnly,则该事务将默默地无法提交,因为会话未刷新。顺便说一句,这很容易测试 - 我希望自从我尝试过这个之后事情没有改变。

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

然后有一个关于and 的链接- 我没有使用过它,也不能真正说出我的意见。readOnlypostgres

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