首页 文章

我想最小化@Transactional的范围吗?

提问于
浏览
1

不确定'范围'是否是正确的术语 .

我正在使用Spring进行JPA事务管理(下面是Hibernate) . 我预先形成数据库事务的方法是私有的,但是因为你只能在类或public method上设置@Transactional

由于此机制基于代理,因此只会拦截通过代理进入的“外部”方法调用 . 这意味着'自调用',即目标对象中调用目标对象的其他方法的方法,即使被调用的方法用@Transactional标记,也不会在运行时导致实际的事务!

我已将该类的公共入口点设置为@Transactional .

@Transactional
public void run(parameters) {
    //First non-database method, takes a decent amount of time
    Data data = getData();
    //Call to database
    storeData(data);
}

private storeData(data) {
    em.persist(data);
}

这是不好的做法吗? Spring是否在这里需要更长时间的开放交易?我正在考虑将storeData()方法移动到DAO类并将其公之于众,但作为学术观点,我想知道对公共重构是否具有任何性能优势 .

3 回答

  • 0

    在您的代码执行与事务上下文交互的操作之前,事务范围无效,在本例中为storeData()方法 . getData()是非事务性的这一事实不应影响代码并发性能,因为任何数据库锁定只会在达到storeData()时发生 .

  • 1

    正如大家所指出的那样,我们应该尽可能减少交易,以便连接可用于其他请求 . 这可以重构吗?

    public void run(parameters) {
      Data data = getData();
      storeData(data);                                                             
     }
    
    @Transactional
    public storeDate(data){em.persist(data)}
    
  • 1

    如果在数据库上存在激烈争用,那么保持事务处理尽可能小是绝对至关重要的 - 比公共与私有区别更重要,这本身不会影响性能和可伸缩性 . 所以,务实......!

相关问题