繁体   English   中英

@交易与否

[英]@Transactional or Not

我有代码。

@Repository
public class ArticlesDao {

    @Autowired
    private SessionFactory sessionFactory;

    /**
     * @param count Specifited how many article get from DB
     * @param start Start offset. Default 0
     * @return all get article
     */

    @Transactional
    public List<Article> getLastArticles(Integer count, Integer start) {

        if (start == null) {
            start = 0;
        }

        final Session currentSession = sessionFactory.getCurrentSession();
        final Criteria criteria = currentSession.createCriteria(Article.class);

        criteria.addOrder(Order.desc("publishedDate"));

        criteria.setFirstResult(count + start);
        criteria.setMaxResults(count);

        return criteria.list();
    }


}

和控制器

@Autowired
ArticlesDao dao;

@RequestMapping(value = "/")
        public ModelAndView getHome(@RequestParam("page") int page) {
      dao.getLastArticles("STH args");
}

我的问题是是否应将Handler getHome()注释为@Transactional

不,您不应在控制器/控制器方法上使用@Transactional。 @Transactional更好/正确用于服务层或DAO。

通常我在服务层而不是DAO中使用@Transactional,因为我希望事务处理保留业务价值操作,而不是基本操作。

在控制器中,如您的示例中一样,没有真正的代码,而只是委派给服务方法(在该方法中启动事务),因此您无需在控制器中启动另一个事务。

最好在服务/业务层上启动声明式事务。

无论如何,我认为@Transactional应该在服务层中使用,同时在集成层中使用。 您可以使用

@Transactional(propagation=Propagation.REQUIRES_NEW)

在您的服务层中,同时

@Transactional(propagation=Propagation.REQUIRED)

在您的DAO中。 您的集成层将更加独立,并且在事务环境中更易于测试。

只有服务层而不是DAO才应该知道事务行为,因为这是业务逻辑的一部分。

此外,您可以使用@Transactional(readOnly = true)将事务@Transactional(readOnly = true)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM