Spring - Transaction Readonly

时间:2010-04-01 18:57:36

标签: java spring transactions readonly

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

  1. DAO层是使用Spring JdbcTemplate(No Hibernate etc)
  2. 的普通旧JDBC
  3. 服务层是具有声明性交易的POJO,如下所示 - save*, readonly = false, rollback for Throwable
  4. 以上设置可以正常运行。但是当我说get*, readonly = true时,我在日志文件中看到Database connection cannot be marked as readonly的错误。对于服务层中的所有get *方法都会发生这种情况。

    现在我的问题是:

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

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

    ℃。为什么有人想要readonly = true的交易方法?这种配置有什么实际意义吗?

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

2 个答案:

答案 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的事务方法?这种配置有什么实际意义吗?

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