2017-07-25 43 views

回答

0

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

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

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

+0

感谢您的回应。但是我使用这个注释来回滚。我想在Domain和Dao层中清楚地理解这个注解的用法。我也想知道使用@Transactional注释的优缺点 –

1

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

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

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

持久层无法知道它在哪个事务中,例如使用方法person.updateUsername()。它应该始终运行在它自己的单独事务中吗?没有办法知道,这取决于调用它的业务逻辑。

以下几个线程,你应该阅读

Where does the @Transactional annotation belong?

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

0

@Transactional:有两个不同的概念来考虑,每个都有它自己的范围和生命周期:持久化上下文,数据库事务 它看起来像你更多的数据库牵引:

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

持久化上下文在JPA EntityManager中,使用休眠会话在内部实现