Spring 分层体系结构中的数据交换和事务
关于这个话题,我读了很多书,但仍然有一些 开放性问题。想象一下下面的场景Spring 分层体系结构中的数据交换和事务,spring,architecture,transactions,layer,Spring,Architecture,Transactions,Layer,关于这个话题,我读了很多书,但仍然有一些 开放性问题。想象一下下面的场景 [表示层] 您希望开发具有两个访问点的应用程序: web前端(基于视图+控制器) 服务api 因此,将业务逻辑与 这些不同的表示视图可供重用 [数据层] 在分层体系结构的另一端,我们有数据层: 域/模型对象来表示某个ORM框架映射的数据 提供创建、读取、更新、删除(crud)功能的数据访问对象(dao) 这一层是关于访问数据的。保留所有数据访问权限 该层中的特定逻辑,因此它可以很容易地被另一层替代 存储系统 [服
[表示层] 您希望开发具有两个访问点的应用程序:
- web前端(基于视图+控制器)
- 服务api
- 域/模型对象来表示某个ORM框架映射的数据
- 提供创建、读取、更新、删除(crud)功能的数据访问对象(dao)
一方面,我不希望这个线程是特定于语言或框架的, 另一方面,我想知道如何通过中央事务来实现 处理(回滚、提交)。假设我们使用弹簧作为一种方便的工具 事务管理框架 1。处理交易的最佳地点在哪里? 显然,它不是数据访问对象的一部分,因为您希望 在一个事务中访问和更改多个对象。所以 事务处理必须在服务级别上应用,如下所示 由spring框架提出 但假设您的业务逻辑如下所示:
- a) 从数据库请求一些对象
- b) 请求有关这些对象的一些远程信息
- c) 更新数据库中对象的状态
期待您的回答……我不确定您拥有的体系结构堆栈,但我遇到最多的是Web层>服务层>数据层。也就是说,Web层通过服务层访问数据层。或者,您可以“直接”到服务层以访问数据层 在这些类型的结构中,JTA事务(在启用时)默认配置为参与现有事务或启动自己的事务。在Spring中,这看起来像是在服务层方法上注释的
@Transactional
(例如updateCustomer
)。如果Web层有一个控制器方法updateCustomerRequest
,该方法调用服务updateCustomer
,还调用createAuditLogEvent
,并且所有这些都必须在一个事务中完成,则Web层启动事务,服务层参与其中,事务在createAuditLogEvent
之后在Web层完成。如果直接调用了服务层的updateCustomer
,则transactionManager仅围绕updateCustomer
方法启动一个新事务
因此,通过使用一种模型,即服务层是您对数据层的“最低访问级别”,Web层通过服务层重用/访问,事务可以在各个层之间共享。我不确定您拥有的体系结构堆栈,但我遇到的最多的是Web层>服务层>数据层。也就是说,Web层通过服务层访问数据层。或者,您可以“直接”到服务层以访问数据层 在这些类型的结构中,JTA事务(在启用时)默认配置为参与现有事务或启动自己的事务。在Spring中,这看起来像是在服务层方法上注释的
@Transactional
(例如updateCustomer
)。如果Web层有一个控制器方法updateCustomerRequest
,该方法调用服务updateCustomer
,还调用createAuditLogEvent
,并且所有这些都必须在一个事务中完成,则Web层启动事务,服务层参与其中,事务在createAuditLogEvent
之后在Web层完成。如果直接调用了服务层的updateCustomer
,则transactionManager仅围绕updateCustomer
方法启动一个新事务
所以,通过使用一个模型