Spring – Transaction Readonly
只想获得关于Spring的声明式事务管理的专家意见。 这是我的设置:
- DAO层是使用Spring JdbcTemplate(No Hibernate等)的普通旧JDBC
- 服务层是具有声明性事务的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的事务方法? 这种配置有什么实际意义吗?
- 帮助防止get()方法中的错误写入
- 出于优化目的。 正如Bozho所提到的,Hibernate不仅可以利用这些信息,而且一些数据库/ JDBC驱动程序也可以利用这些信息。