事务性:控制器与服务
问题内容:
考虑一下我有一个控制器方法get()
,该方法调用一些使用数据库的服务方法。
使整个控制器方法具有事务性或仅使每个服务方法正确吗?
在我看来,我们必须使其具有get()
事务性,因为它执行关联的操作。
问题答案:
我更喜欢仅使事务性的服务方法需要事务性,并控制服务中的事务性而不是控制器中的事务性。您可以创建一个包含其他服务方法的服务方法,并使用spring事务通过@Transactional批注中的传播来管理事务。
@Transactional(propagation =...)
编辑
如果我有2种方法,例如saveUser()和saveEmail()(因为我将电子邮件存储在数据库中,以便以后发送它们-
像队列一样),我将在服务中创建一个方法saveUserAndSendEmail(User
user),该方法将是事务性的。此方法将在@Repository组件中分别调用saveUser和saveEmail(),因为它们处理数据库。因此,我会将它们放在@Repository组件中,以使用数据库处理的方法,然后在@Service组件中控制事务性。这样,控制器将只需要担心在需要时提供数据和调用数据的麻烦。但是我进行事务是因为在整个方法成功执行之前,我不希望在数据库中提交更改。
但这是我通常使用的样式,我并不是说这一定是要走的路。