Spring中层之间的@Transaction注释

时间:2017-07-25 14:22:27

标签: spring spring-annotations

在域/服务层和Dao层中使用此@Transactional注释有何不同。它是否会在Domain层中提供任何优势。

3 个答案:

答案 0 :(得分:2)

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

DAO可以像任何其他bean一样person.updateUsername(),但在服务层中使用它是一种常见做法。我们倾向于这样做,因为我们希望分离关注点。持久层只是从数据库中来回检索/存储数据。

例如,如果我们想将一些金额从一个帐户转移到另一个帐户,我们需要两个操作,一个帐户需要借记其他需要记入。因此,这些操作的范围仅为服务层而非持久层所知。

持久层无法知道它所处的事务,例如采用方法{{1}}。它应该始终在它独立的交易中运行吗?没有办法知道,这取决于调用它的业务逻辑。

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

Where does the @Transactional annotation belong?

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

答案 1 :(得分:0)

您使用的地点@Transactional注释指定了交易的范围。

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

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

答案 2 :(得分:0)

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

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

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

相关问题