"@Transactional"应放在哪里放置服务层或DAO

Sha*_*zeb 77 spring dao transactions

首先,我可能会问一些之前被问过和回答的问题,但我无法获得搜索结果.好的一般(或总是到目前为止:))我们通常在服务层上定义事务注释典型的spring hibernate crud

控制器 - >经理 - >道 - >奥姆.

我现在有一种情况需要在基于客户端站点的域模型之间进行选择.假设客户端A使用我的域模型一切都很好但是其他客户端站点会给我一个Web服务而不是使用我们的域模型.

我应该替换哪一层.我相信它必须是Dao,它将从Web服务中获取数据并将其发送回来.两个单独编写的Dao图层并根据场景插入.

我现在已经意识到,当我们在服务层中放置@Transactional时,我们一直在进行紧耦合(如果有这样的事情或说没有松耦合).这么多大脑不会错,或者是他们(我对此表示怀疑).

所以问题是"应该在哪里"@Transactional"放置服务层或DAO?" 是服务层向下我应该更换.

Bad*_*dal 69

理想情况下,服务层(Manager)代表您的业务逻辑,因此应使用@Transactional进行注释.

服务层可以调用不同的DAO来执行数据库操作.让我们假设您在服务方法中有3个DAO操作的情况.如果您的第一个DAO操作失败,其他两个可能仍然通过,您将结束不一致的DB状态.注释服务层可以避免这种情况.


hvg*_*des 57

您将希望您的服务是交易性的.如果您的DAO是事务性的,并且您在每个服务中调用不同的DAO,那么您将拥有多个tx,这不是您想要的.使服务调用事务性,并且这些方法内的所有DAO调用都将参与该方法的tx.

  • 他不能在他的`@Transaction`注释中指定一个Propagation方法,所以只使用了一个事务,因为它在[here]中列出(http://static.springsource.org/spring/docs/3.0.x/弹簧框架参考/ HTML/transaction.html#TX-传播) (6认同)

kap*_*das 6

i will suggest to put @Transactional in Service layer methods since we can have multiple DAO implementations. by using this we can made our services will be transactional. refer

best practice is to use A generic BasicService to offer common services.

The Service is the best place for putting @Transactional, service layer should hold the detail-level use case behavior for a user interaction that would logically go in a transaction. in this way we can have maintain separation between web application code and business logic.

There are a lot of CRUD applications that don't have any significant business logic, for them having a service layer that just passes stuff through between the controllers and data access objects is not useful. In these cases we can put transaction annotation on Dao.

因此,在实践中,您可以将它们放在任意位置,这取决于您。

通过在服务中进行多个调用,您需要在服务中使用@Transactional。如果将@Transactional置于服务中,则对服务的不同调用将在不同的事务中执行。