【发布时间】:2011-05-26 15:43:31
【问题描述】:
假设我有一个控制器方法get(),它调用了一些使用数据库的服务方法。
将整个控制器方法设置为事务性还是只设置每个服务方法是否正确?
在我看来,我们必须使get() 具有事务性,因为它执行相关操作。
【问题讨论】:
假设我有一个控制器方法get(),它调用了一些使用数据库的服务方法。
将整个控制器方法设置为事务性还是只设置每个服务方法是否正确?
在我看来,我们必须使get() 具有事务性,因为它执行相关操作。
【问题讨论】:
我更喜欢仅将需要事务性的服务方法设为事务性,并控制服务中的事务性而不是控制器中的事务性。您可以创建一个包含其他服务方法的服务方法,并使用 spring 事务通过 @Transactional 注释中的传播来管理事务。
@Transactional(propagation =...)
编辑
如果我有 2 种方法,例如 saveUser() 和 saveEmail()(因为我将电子邮件存储在数据库中以便稍后发送它们 - 就像一个队列)我会在我的服务中创建一个方法 saveUserAndSendEmail(User user) 这将交易。此方法将在 @Repository 组件中分别调用 saveUser 和 saveEmail() ,因为它们处理数据库。所以我会将它们放在@Repository 组件中处理数据库的方法,然后我控制@Service 组件中的事务性。然后控制器将只需要担心提供数据并在需要时调用。但是我做一个事务是因为我不想在整个方法执行成功之前提交数据库中的更改。
但这是我通常使用的风格,我并不是说这一定是要走的路。
【讨论】:
这完全取决于您,以及您如何解释自己的业务逻辑。
Spring 并不真正关心您将事务边界放在哪里,当然也不限制您将它们放在您的 DAO 类中。
所以是的,将@Transactional 添加到您的控制器方法中是完全有效的。
【讨论】: