Spring - Transaction Readonly

AAK*_*AAK 23 java spring transactions 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?这种配置有什么实际意义吗?

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

Boz*_*zho 23

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

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

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

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

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

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


mat*_*t b 5

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

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

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

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