Spring @Transactional 只读模式的回滚行为

8

我有一些服务层方法带有@Transactional(readOnly=true)注释,这些方法经常导致一些RuntimeException(比如说某些NotFoundException异常)。

我还使用了ORM Hibernate来进行数据库交互处理。

这样做是否合法?

在这种情况下,"回滚"行为的默认行为是什么?它会对连接状态产生不良影响或者导致任何问题吗?


这不是像"为什么不尝试自己做一下?"那样简单。我怀疑在同一个方法中,当出现一定数量的异常后,会导致Transaction rolled back because it has been marked as rollback-only错误。这个错误可能是非常特定的JDBC PostgreSQL驱动程序错误。这就是为什么我想知道这个设计是否合法的原因。


请查看此链接 http://256stuff.com/gray/docs/misc/performance_optimizing_spring_hibernate_transactions/ - reos
不要在那里回滚和抛出运行时异常。 - Andremoniy
1
@Andremoniy 谢谢接受,说实话我不记得写过这个了,现在读了一下,什么都不记得了))) 可能需要刷新一下。 - Eugene
1个回答

4
据我所知,您担心回滚问题。在这种情况下,readOnly 是一个 select 语句,通常没有需要从 read 中回滚的内容。唯一有用的情况是当您在锁定状态下读取时,并且在事务完成后释放该锁定。

readOnly 将设置刷新模式为 FlushMode.NEVER,这既好又坏。好处是不会进行脏检查,如 此处 所述。不好的地方在于,如果您在 readOnly 事务中调用 读/写 事务,则事务将无声地失败并未提交,因为会话未刷新。顺便说一下,这很容易测试,我希望自从我尝试过这个以来,事情没有改变。

接下来是连接池。我知道 C3P0 的默认策略是回滚任何未提交的工作。控制此行为的标志是 autoCommitOnClose
然后有关于readOnlypostgres链接 - 我没有使用过,无法发表意见。
现在来谈谈你提到的Transaction rolled back because it has been marked as rollback-only。对于只读事务,可能没有需要回滚的内容,所以我认为这真的取决于您如何链接您的@Transactional方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接