Spring – Transaction Readonly

只想获得关于Spring的声明式事务管理的专家意见。 这是我的设置:

  1. DAO层是使用Spring JdbcTemplate(No Hibernate等)的普通旧JDBC
  2. 服务层是具有声明性事务的POJO,如下所示 – save*, readonly = false, rollback for Throwable

上面的设置可以解决问题。 但是,当我说get*, readonly = true ,我在日志文件中看到错误,说Database connection cannot be marked as readonly 。 这适用于服务层中的所有get *方法。

现在我的问题是:

A.我是否必须将get*设置为只读? 我所有的get*方法都是纯读取DB操作。 我不希望在任何事务上下文中运行它们。 上述错误有多严重?

B.当我删除get*配置时,我没有看到错误。 而且,我所有简单的get*操作都是在没有事务的情况下执行的。 这是要走的路吗?

C.为什么有人想要readonly = true事务方法? 这种配置有什么实际意义吗?

谢谢! 一如既往,非常感谢您的回复!

这篇文章告诉我们行为或readOnly标志是持久性机制依赖的。

C.是的,当使用hibernate时,它通过将刷新模式设置为FLUSH_NEVER来提供性能优势(如链接post中所述)

B.是的,JDBC调用不需要事务(hibernate需要一个),因此删除@Transactional配置会修改所有事务管理。

答:我假设spring正在调用connection.setReadOnly(true)但是你的JDBC驱动程序不支持这个

底线是:不要使用普通JDBC的readonly事务。

另一件事 – 交易应该跨越多个查询。 不要让你的交易太细粒度。 让他们成为一个工作单位 。

A.我是否必须说get * as readonly? 我所有的get *方法都是纯读取DB操作。 我不希望在任何事务上下文中运行它们。 上述错误有多严重?

实际上,您可能仍希望在事务的上下文中运行所有get() ,以确保获得一致的读取。 另一方面,如果您不关心这一点,则可以相应地设置事务级别。

C.为什么有人想要readonly = true的事务方法? 这种配置有什么实际意义吗?

  1. 帮助防止get()方法中的错误写入
  2. 出于优化目的。 正如Bozho所提到的,Hibernate不仅可以利用这些信息,而且一些数据库/ JDBC驱动程序也可以利用这些信息。