【问题标题】:Should I avoid big transaction and exclude read-only queries from transaction我是否应该避免大事务并从事务中排除只读查询
【发布时间】:2022-01-04 02:56:20
【问题描述】:

我看过文章说我们应该尝试限制事务的范围,例如而不是这样做:

@Transactional
public void save(User user) {
      queryData();
      addData();
      updateData();
}

我们应该使用 Spring 的 TransactionTemplatequeryData 从事务中排除(或将其移出事务方法):

@Autowired
private TransactionTemplate transactionTemplate;
   
public void save(final User user) {
      queryData();

      transactionTemplate.execute((status) => {
         addData();
         updateData();
         return Boolean.TRUE;
      })
}

但我的理解是,由于JDBC will always need a transaction for all operations,如果我使用第二种方式,将有2个事务打开和关闭,1个用于queryData(由JDBC打开),另一个用于transactionTemplate.execute内的代码由打开我们班。如果是这样,既然您已经将 1 个事务拆分为 2 个,这不会浪费资源吗?

【问题讨论】:

    标签: java spring hibernate jdbc transactions


    【解决方案1】:

    如果一个事务启动,它将用完一个数据库连接。所以我们通常希望事务尽快完成,并尽可能延迟启动它,直到我们真正需要访问数据库,以便连接池有更多时间提供更多可用连接供其他请求使用。

    因此,如果您的函数中的部分工作流需要花费一些时间来完成他们的工作,并且该工作不是访问数据库所必需的,那么最好限制事务的范围以排除这部分代码。

    但在您的示例中,由于两个事务都是按顺序执行的,并且都需要访问 DB ,因此我认为没有任何要点可以将它们分成两个不同的事务。

    另外,就 Hibernate 而言,在同一个事务中加载和更新实体是非常正常的,这样如果您更新的实体是从另一个已经关闭的事务中加载的,您就不需要处理分离的实体。如果您不熟悉 Hibernate,请处理分离的实体 is not easy

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多