考虑我有一个控制器方法get()
,它调用一些使用数据库的服务方法。
使整个控制器方法具有事务性或仅使用每种服务方法是否正确?
在我看来,我们必须进行get()
事务处理,因为它执行相关的操作。
答案 0 :(得分:8)
这完全取决于您,以及您如何解释自己的业务逻辑。
Spring并不关心您放置事务边界的位置,当然也不限制您将它们放在DAO类上。
所以是的,将@Transactional
添加到控制器方法是完全有效的。
答案 1 :(得分:7)
我更喜欢只使用事务性处理需要事务的服务方法,并控制服务中的事务性而不是控制器中的事务性。您可以创建一个服务方法来使用其他服务方法,并使用spring事务管理事务,并在@Transactional注释中传播。
@Transactional(propagation =...)
修改强>
如果我有2个方法,例如saveUser()和saveEmail()(因为我将电子邮件存储在数据库中以便稍后发送 - 就像一个队列)我会在我的服务中创建一个方法saveUserAndSendEmail(用户用户)是交易的。此方法将在@Repository组件中调用saveUser和saveEmail(),因为它们处理数据库。所以我会把它们放在@Repository组件中处理数据库的方法,然后我控制@Service组件中的事务性。然后,控制器只需要担心在需要时提供数据和呼叫。但是我做了一个事务,因为我不想在数据库中提交更改,直到整个方法成功执行。
但这是我经常使用的风格,我不是说这一定是要走的路。