【问题标题】:@Transaction annotation between layers in SpringSpring中层之间的@Transaction注解
【发布时间】:2017-12-31 13:07:15
【问题描述】:

在Domain/Service层和Dao层使用这个@Transactional注解有什么区别。在域层中使用它会提供任何优势吗?

【问题讨论】:

    标签: spring spring-annotations


    【解决方案1】:

    在服务层使用@Transactional 是一种很好的做法,因为它管理识别数据库和/或业务事务范围所需的逻辑。设计的持久层不知道事务的范围。

    DAO 可以像任何其他 bean 一样被制作为@Transactional,但在服务层中使用它是一种常见的做法。我们倾向于这样做是因为我们想要关注点分离。持久层只是从数据库中来回检索/存储数据。

    例如,如果我们想将一些金额从一个帐户转移到另一个帐户,我们需要两个操作,一个帐户需要借记,另一个需要贷记。所以,这些操作的范围只有服务层知道,持久层不知道。

    持久层无法知道它在哪个事务中,例如一个方法person.updateUsername()。它是否应该始终在自己的单独事务中运行?没办法知道,要看调用它的业务逻辑。

    这里有一些你应该阅读的主题

    Where does the @Transactional annotation belong?

    Where should "@Transactional" be place Service Layer or DAO

    【讨论】:

      【解决方案2】:

      你使用@Transactional注解的地方指定了你的事务范围。

      在 DAO 层中使用它时,您指定每个 DAO 操作将在事务中提交。

      在服务中使用它时,您指定每个服务操作(业务单元)在事务中提交,这是推荐的,因为通常服务方法表示应该包含在同一事务中的业务单元,因为任何失败都应该回滚整个业务部门。

      【讨论】:

      • 感谢您的回复。但我正在使用此注释进行回滚。我想清楚地了解此注释在 Domain 和 Dao 层中的用法。我也想知道使用@Transactional注解的优缺点
      【解决方案3】:

      @Transactional:有两个独立的概念需要考虑,每个都有自己的范围和生命周期:持久性上下文,数据库事务 看起来你更喜欢数据库牵引力:

      @Transactional 注解本身定义了单个数据库事务的范围。数据库事务发生在持久化上下文的范围内。

      持久化上下文在 JPA EntityManager 中,使用 Hibernate Session 在内部实现

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-04
        • 2013-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-31
        • 2011-10-11
        相关资源
        最近更新 更多