春季 - 事务只读

2022-09-01 21:01:14

只是需要您对Spring的声明式交易管理的专家意见。这是我的设置:

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

上述设置工作正常。但是,当我说,我看到日志文件中的错误说.对于服务层中的所有 get* 方法,都会发生这种情况。get*, readonly = trueDatabase connection cannot be marked as readonly

现在我的问题是:

一个。是否必须设置为只读?我的所有方法都是纯读取数据库操作。我不希望在任何事务上下文中运行它们。上述错误的严重程度如何?get*get*

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

C.为什么有人想要有交易方法在哪里?这种配置有什么实际意义吗?readonly = true

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


答案 1

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

C.是的,使用休眠时,通过将刷新模式设置为(如链接文章中所述),可以获得性能优势FLUSH_NEVER

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

一个。我假设spring正在调用,但您的JDBC驱动程序不支持此功能connection.setReadOnly(true)

底线是:不要使用普通JDBC的交易。readonly

另一件事 - 事务应该跨越多个查询。不要让你的交易过于细粒度。使它们成为工作单元


答案 2

一个。我必须说 get* 为只读吗?我所有的get*方法都是纯读取数据库操作。我不希望在任何事务上下文中运行它们。上述错误的严重程度如何?

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

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

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

推荐