【发布时间】:2017-12-31 13:07:15
【问题描述】:
在Domain/Service层和Dao层使用这个@Transactional注解有什么区别。在域层中使用它会提供任何优势吗?
【问题讨论】:
在Domain/Service层和Dao层使用这个@Transactional注解有什么区别。在域层中使用它会提供任何优势吗?
【问题讨论】:
在服务层使用@Transactional 是一种很好的做法,因为它管理识别数据库和/或业务事务范围所需的逻辑。设计的持久层不知道事务的范围。
DAO 可以像任何其他 bean 一样被制作为@Transactional,但在服务层中使用它是一种常见的做法。我们倾向于这样做是因为我们想要关注点分离。持久层只是从数据库中来回检索/存储数据。
例如,如果我们想将一些金额从一个帐户转移到另一个帐户,我们需要两个操作,一个帐户需要借记,另一个需要贷记。所以,这些操作的范围只有服务层知道,持久层不知道。
持久层无法知道它在哪个事务中,例如一个方法person.updateUsername()。它是否应该始终在自己的单独事务中运行?没办法知道,要看调用它的业务逻辑。
这里有一些你应该阅读的主题
【讨论】:
你使用@Transactional注解的地方指定了你的事务范围。
在 DAO 层中使用它时,您指定每个 DAO 操作将在事务中提交。
在服务中使用它时,您指定每个服务操作(业务单元)在事务中提交,这是推荐的,因为通常服务方法表示应该包含在同一事务中的业务单元,因为任何失败都应该回滚整个业务部门。
【讨论】:
@Transactional:有两个独立的概念需要考虑,每个都有自己的范围和生命周期:持久性上下文,数据库事务 看起来你更喜欢数据库牵引力:
@Transactional 注解本身定义了单个数据库事务的范围。数据库事务发生在持久化上下文的范围内。
持久化上下文在 JPA EntityManager 中,使用 Hibernate Session 在内部实现
【讨论】: