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注解的主要内容,如果未能解决你的问题,请参考以下文章

spring 注解事务的原理(@Transaction)

transaction的方法调用无注解的方法

关于spring事务注解实战

关于Spring注解@Async引发其他注解失效

坦言spring中事务重试异步执行注解

Grails @Transactional 与 Spring @Transactional 注释之间的差异