分层体系结构中的数据交换和事务

时间:2013-08-08 09:08:00

标签: spring architecture transactions layer

我已经对这个主题做了大量的阅读,但仍然有一些 开放的问题。想象一下以下场景。


[演示层]

您希望开发具有两个访问点的应用程序:

  • 网络前端(基于视图+控制器)
  • service api

因此,完全可以保持业务逻辑的独立性 这些不同的表示视图可供重用。

[数据层]

在分层架构的另一端,我们有数据层:

  • 域/模型对象,用于表示某些ORM框架映射的数据
  • 提供创建,读取,更新,删除(crud)功能的数据访问对象(dao)

这一层是关于访问您的数据。保持所有数据访问 这一层中的特定逻辑因此可以很容易地被另一个人取代 存储系统。

[服务层]

这是数据层和表示层之间的层 所有业务逻辑发生的地方。


一方面,我不希望这个线程是语言或框架特定的, 另一方面,我想知道如何通过中央交易实现这一目标 处理(回滚,提交)。所以我们假设我们使用spring作为方便 交易管理框架。

1。处理交易的最佳地点在哪里???

显然,它不是您想要的数据访问对象的一部分 在一次交易中访问和更改多个对象。因此 必须在服务级别上应用事务处理 由spring框架提出。

但是假设你的业务逻辑做了类似的事情:

  • a)从db
  • 请求一些对象
  • b)请求关于这些对象的一些远程信息
  • c)更新db
  • 中对象的状态

由于操作b可能需要不确定的时间长度,因此您不会 喜欢跨越此操作的事务,因为它将分配 宝贵的系统资源。因此,一些业务逻辑必须如此 与其他人分开。

这是否意味着服务层必须分为两层, 一个是交易的,一个不是???

2。如何修改和检索数据???

为了呈现表示层必须知道的数据 域对象。通过使用服务层授予的daos 访问这些objets到表示层。我看到两个问题 用这种方法。

a)我们假设hibernate被用作一个方便的ORM框架。 然后依赖项加载延迟,这对于大多数其他ORM都是如此 框架也是如此。所以我的视图代码试图访问我的复杂对象 可能会因为事务上下文而得到一些延迟加载异常 由服务层结束。

处理这种情况的正确方法是什么?

b)控制器通常使用一些框架魔术来应用 Web表单中的更改直接发送到我的模型对象。这又一次 在任何事务上下文之外,这意味着该服务 图层必须提供将模型对象重新附加到新图层的功能 交易并保存它们。

这真的是正确的方式???

期待您的回答......

1 个答案:

答案 0 :(得分:0)

我不确定你所拥有的架构堆栈,但我遇到的最多的是Web Layer>服务层>数据层。也就是说,Web层通过服务层访问数据层。或者,您可以“直接”到服务层以获取数据层。

在这些类型的结构中,JTA事务(默认情况下启用时)默认配置为参与现有事务,或者启动自己的事务。在Spring中,这看起来像@Transactional在服务层方法上注释(例如updateCustomer)。如果Web层具有调用服务updateCustomerRequest并且还调用updateCustomer的控制器方法createAuditLogEvent,并且所有这些必须在一个事务中完成,则Web层启动事务,服务层在其中参与,并且事务在createAuditLogEvent之后在Web层中完成。如果直接调用服务层的updateCustomer,则transactionManager仅围绕updateCustomer方法启动新事务。

因此,通过使用服务层对数据层进行“最低级别访问”的模型,以及Web层通过服务层重用/访问,可以在各个层之间共享事务。