Spring中层之间的@Transaction注解
Posted
技术标签:
【中文标题】Spring中层之间的@Transaction注解【英文标题】:@Transaction annotation between layers in Spring 【发布时间】:2017-12-31 13:07:15 【问题描述】:在Domain/Service层和Dao层使用这个@Transactional
注解有什么区别。在域层中使用它会提供任何优势吗?
【问题讨论】:
【参考方案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 在内部实现
【讨论】:
以上是关于Spring中层之间的@Transaction注解的主要内容,如果未能解决你的问题,请参考以下文章