Transactional: controller vs service 事务性:控制器 vs 服务

7 浏览
0 Comments

Transactional: controller vs service 事务性:控制器 vs 服务

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

将整个控制器方法还是每个服务方法设置为事务性,哪种方式是正确的?

我认为我们必须将get()设置为事务性,因为它执行了相关操作。

0
0 Comments

问题的出现原因是在事务的控制层和服务层之间的选择。在控制层中添加事务可能会导致事务持续的时间比实际需要的时间更长。因此,最好只在需要的地方使用事务。服务层更适合添加事务。

解决方法是只在控制层的数据库调用中使用事务,并且不将API调用包含在事务中。这样可以避免在API调用需要较长时间才能获得响应时,事务持续的时间过长。对于小规模应用程序,这可能没有太大影响,但对于高流量应用程序,可能会耗尽数据库连接。

以上是一个示例代码,其中展示了在控制器方法中的数据库调用和API调用。最佳做法是只将数据库调用放在事务中,以防止API调用的时间过长。在事务中,首先保存支付请求到数据库,然后调用支付提供者的API,接着更新支付状态和保存审核历史。

总之,为了避免事务持续时间过长,应该在控制层的数据库调用中使用事务,并将API调用排除在事务之外。这样可以优化应用程序的性能,并避免数据库连接耗尽的问题。

0
0 Comments

在软件开发中,事务管理是非常重要的。事务是指一系列数据库操作,要么全部执行成功,要么全部回滚到原始状态。在Spring框架中,我们可以使用@Transactional注解来管理事务。在这个问题中,我们讨论了在控制器和服务中使用@Transactional的区别。

一些开发者更喜欢在服务中管理事务,而不是在控制器中。他们认为只有那些需要事务支持的服务方法才应该被标注为@Transactional。这样做的好处是,控制器只需关注数据的提供和调用,而事务管理则完全交给了服务。

解决这个问题的方法是使用Spring的事务传播机制。我们可以在服务中创建一个方法,使用@Transactional注解,并设置合适的事务传播属性,比如propagation = ...。这个方法可以调用其他服务方法,每个服务方法负责处理数据库操作。这样一来,事务管理就完全交给了服务。

举个例子,假设我们有两个方法saveUser()和saveEmail(),分别属于user和email两个服务。我们可以在服务中创建一个saveUserAndSendEmail(User user)方法,并标注为@Transactional。这个方法会分别调用saveUser()和saveEmail()方法,每个方法都负责处理数据库操作。这样一来,我们就可以在整个saveUserAndSendEmail()方法执行成功之前,不提交任何数据库更改。

但是需要注意的是,这种方式并不一定是最佳设计。如果我们有多个类似的方法,比如loadMenuItems()、loadUserInfo()和loadDocument(),按照这种方式,我们可能需要创建一个loadMenuItemsAndUserInfoAndDocument()方法,将它们封装在一起。这样可能会导致代码冗余和难以维护。

另外,如果我们有两个不同服务的方法,比如createUser()和sendEmail(),并且需要在控制器中以事务方式调用它们,我们可以使用外观模式。我们可以创建一个名为UserEmailFacade的服务,它内部调用createUser()和sendEmail()方法,并使用@Transactional注解进行事务管理。

,使用@Transactional注解来管理事务是非常重要的。在选择是在控制器还是服务中使用@Transactional时,可以根据个人偏好和具体需求来决定。在控制器中使用@Transactional可以让代码更简洁,但可能会使控制器与事务管理耦合在一起。在服务中使用@Transactional可以更好地将事务管理和业务逻辑分离,但可能会导致代码冗余。

0
0 Comments

Transactional: controller vs service 这个问题的出现的原因是在于对于事务的管理应该放在哪一层。解决方法是将事务管理放在service层。

在Spring中,事务的边界可以放在任何地方,不限于在DAO类上。因此,在controller方法上添加@Transactional是完全有效的。

然而,从架构的角度来看,将事务放在controller中并没有太多意义。因为根据MVC的设计原则,controller不应该意识到持久层,并且在桌面应用程序中可能需要重用业务逻辑而不再存在controller层。因此,事务的定义应该放在service层。

从语言的角度来看,将事务绑定到controller方法并不是一个好的做法。因此,最佳实践是将事务管理放在service层。

将事务管理放在service层是更合适的做法,这样可以符合MVC的设计原则,并且能够在不同的应用程序中重用业务逻辑。

0