簡體   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