Transactions 事务:控制器与服务

Transactions 事务:控制器与服务,transactions,spring-mvc,Transactions,Spring Mvc,假设我有一个控制器方法get(),它调用一些处理数据库的服务方法 将整个控制器方法设置为事务性的还是仅将每个服务方法设置为事务性的 在我看来,我们必须使get()具有事务性,因为它执行相关的操作。这完全取决于您以及您如何解释自己的业务逻辑 Spring并不真正关心事务边界放在哪里,当然也不限制您将它们放在DAO类中 因此,是的,将@Transactional添加到控制器方法是完全有效的。我更喜欢只将需要事务性的服务方法设置为事务性,并控制服务中的事务性,而不是控制器中的事务性。您可以创建一个服务

假设我有一个控制器方法
get()
,它调用一些处理数据库的服务方法

将整个控制器方法设置为事务性的还是仅将每个服务方法设置为事务性的


在我看来,我们必须使
get()
具有事务性,因为它执行相关的操作。

这完全取决于您以及您如何解释自己的业务逻辑

Spring并不真正关心事务边界放在哪里,当然也不限制您将它们放在DAO类中


因此,是的,将
@Transactional
添加到控制器方法是完全有效的。

我更喜欢只将需要事务性的服务方法设置为事务性,并控制服务中的事务性,而不是控制器中的事务性。您可以创建一个服务方法,它支持其他服务方法,并使用spring事务在@Transactional annotation中通过传播管理事务

@Transactional(propagation =...)
编辑

如果我有两个方法,例如saveUser()和saveEmail()(因为我将电子邮件存储在数据库中,以便以后发送,就像队列一样),我会在我的服务中创建一个方法saveuserandsendmail(用户用户),这将是事务性的。此方法将在@Repository组件中分别调用saveUser和saveEmail(),因为它们处理数据库。因此,我将把它们放在@Repository组件中,这些方法用于处理数据库,然后我控制@Service组件中的事务性。然后,控制器只需担心提供数据和在需要时调用数据。但是我做了一个事务,因为在整个方法成功执行之前,我不想提交数据库中的更改


但这是我通常使用的风格,我并不是说这一定是我的风格。

这似乎是首选设计,但为什么?考虑到我需要加载MeMeNuuTeMe()、LoopUsSeriFo()、LoopDebug()-大量方法。根据你的说法,我必须创建一个loadMenuItemsAndUserInfoAndDocument()方法-可以吗?@Andrey我没有说这是首选设计。这是我通常的工作方式,因为我更喜欢控制器不需要知道事务管理。根据以load开头的方法的名称。。。如果它们只来自数据库,那么为什么需要进行事务处理呢?好吧,如果您有两种方法:createUser()、sendEmail(),它们来自不同的服务(user和mail)。您需要在事务控制器中调用它们。你该怎么办?@Aundrey我用两种方法编辑了这个问题,这两种方法都需要在事务中使用,因为它们都需要在数据库中保存数据。IMHO,@Transactional在控制器中从架构角度(MVC)看没有太多意义。我的意思是,控制器不应该知道持久性层,您可能必须在不再存在控制器层的桌面应用程序中重用您的业务逻辑。。。我认为事务性应该在@Service层中定义。从语言的角度来看完全有效。但是,如果考虑将控制器方法绑定到一些DB操作,那不是一个好的做法。