【问题标题】:Should I use @Transactional for simple queries with JdbcTemplate? [duplicate]我应该使用@Transactional 来使用 JdbcTemplate 进行简单查询吗? [复制]
【发布时间】:2018-02-15 20:05:16
【问题描述】:

我正在使用没有 Hibernate 的 Spring JdbcTemplate。如果它执行一个简单的选择或一个简单的插入查询,我应该用@Transactional注释方法吗?我应该将@Transactional(readonly=true) 用于专门针对Oracle 的只读方法吗?这样做有什么好处和坏处?

【问题讨论】:

    标签: java database spring transactions spring-transactions


    【解决方案1】:

    如果它执行一个简单的选择或一个简单的插入查询,我应该用@Transactional 注释方法吗?

    是的。基本上,对数据库的每次访问都应该在事务中完成。这就是保证 ACID 属性的原因。即使你现在有一个查询,明天你会想到什么,需求或设计不会改变,你不会有两个查询?为什么要避免使用事务性?

    我应该将@Transactional(readonly=true) 用于专门在Oracle 上的只读方法吗?

    AFAIK,使用 JdbcTemplate,它没有任何价值(除了记录事务应该是只读的),因为您可以完全控制执行哪些查询。

    【讨论】:

      【解决方案2】:
      1. 当你做一个简单的选择时,@Transactional 不需要。但是,当您编写修改数据的原子逻辑时,您应该使用 @Transactional 和 JdbcTemplate 来正确回滚,以防出现任何异常。并注意@JBNizet 关于 ACID 的回答。
      2. @Transactional(readonly=true) 可以用作底层低级代码的标记或提示,指定所有语句都可以在只读数据上执行。例如,您可以使用它通过RoutingDataSource 在主(读写)和从(只读)数据库之间分配查询。

      【讨论】:

      • 1.这是完全错误的。 ACID 中的 I 表示隔离。如果您不在单个事务中执行它们,您根本无法保证两个后续选择将在一致的快照上完成。因此,您会丢失可重复读取、已提交读取或隔离级别提供的任何保证
      • @JBNizet,您对事务隔离完全正确。但是主题启动器询问的是“一个简单的选择”而不是两个,并且不需要@Transactional。编辑答案。
      • 当然可以,但是不使用它有什么意义。您获得的只是在向业务逻辑添加第二个查询时忘记添加它的风险。
      • 例如:spring 使用几个 aop-proxy 包装事务方法调用,而没有事务注释。有时,这一点开销可能比未来变化的风险更重要。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多