交易:控制器与服务

时间:2010-12-16 16:07:45

标签: transactions spring-mvc

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

使整个控制器方法具有事务性或仅使用每种服务方法是否正确?

在我看来,我们必须进行get()事务处理,因为它执行相关的操作。

2 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:7)

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

@Transactional(propagation =...)

修改

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

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