交易:控制器与服务

And*_*gin 11 transactions spring-mvc

考虑我有一个控制器方法get(),它调用一些使用数据库的服务方法.

使整个控制器方法成为事务性或只是每个服务方法是否正确?

在我看来,我们必须进行get()交易,因为它执行相关的操作.

ska*_*man 8

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

Spring并不关心您放置事务边界的位置,当然也不限制您将它们放在DAO类上.

所以是的,添加@Transactional到您的控制器方法是完全有效的.

  • 恕我直言,控制器中的@Transactional从架构角度来看并没有多大意义(MVC).我的意思是,控制器不应该知道持久层,你可能必须在你的控制器层不再存在的桌面应用程序中重用业务逻辑......我认为应该在@Service层定义事务性. (10认同)

Jav*_*avi 7

我更喜欢只在事务上使用需要事务的服务方法,并控制服务中的事务性而不是控制器中的事务性.您可以创建一个服务方法来使用其他服务方法,并使用spring事务管理事务,并在@Transactional注释中进行传播.

@Transactional(propagation =...)
Run Code Online (Sandbox Code Playgroud)

编辑

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

但这是我经常使用的风格,我不是说这一定是要走的路.

  • 好吧,如果您有两种方法:来自不同服务(用户和邮件)的createUser()和sendEmail()怎么办。而且您需要在事务控制器中同时调用它们。你该怎么办? (2认同)