只想获得关于Spring的声明式事务管理的专家意见。这是我的设置:
save*, readonly = false, rollback for Throwable
以上设置可以正常运行。但是当我说get*, readonly = true
时,我在日志文件中看到Database connection cannot be marked as readonly
的错误。对于服务层中的所有get *方法都会发生这种情况。
现在我的问题是:
一个。我必须将get*
设置为只读吗?我的所有get*
方法都是纯读取数据库操作。我不希望在任何事务上下文中运行它们。上述错误有多严重?
B中。当我删除get*
配置时,我没有看到错误。更重要的是,我的所有简单get*
操作都是在没有事务的情况下执行的。这是要走的路吗?
℃。为什么有人想要readonly = true
的交易方法?这种配置有什么实际意义吗?
谢谢!一如既往,非常感谢您的回复!
答案 0 :(得分:23)
This post告诉行为或readOnly
标志是持久性机制依赖的。
C。是的,在使用hibernate时,它通过将刷新模式设置为FLUSH_NEVER
(如链接帖子中所述)来提供性能优势
B。是的,JDBC调用不需要事务(hibernate需要事务),因此删除@Transactional
配置会修改所有事务管理。
A。我认为spring正在调用connection.setReadOnly(true)
但是你的JDBC驱动程序不支持这个
底线是:不要使用普通JDBC的readonly
事务。
另一件事 - 交易应该跨越多个查询。不要让你的交易太细粒度。让他们a unit of work。
答案 1 :(得分:5)
一个。我不得不说get * as readonly?我所有的get *方法都是纯读取DB操作。我不希望在任何事务上下文中运行它们。上述错误有多严重?
实际上,您可能仍希望在事务的上下文中运行所有get()
,以确保获得一致的读取。另一方面,如果您不关心这一点,则可以相应地设置事务级别。
℃。为什么有人想要readonly = true的事务方法?这种配置有什么实际意义吗?