我已经对这个主题做了大量的阅读,但仍然有一些 开放的问题。想象一下以下场景。
[演示层]
您希望开发具有两个访问点的应用程序:
因此,完全可以保持业务逻辑的独立性 这些不同的表示视图可供重用。
[数据层]
在分层架构的另一端,我们有数据层:
这一层是关于访问您的数据。保持所有数据访问 这一层中的特定逻辑因此可以很容易地被另一个人取代 存储系统。
[服务层]
这是数据层和表示层之间的层 所有业务逻辑发生的地方。
一方面,我不希望这个线程是语言或框架特定的, 另一方面,我想知道如何通过中央交易实现这一目标 处理(回滚,提交)。所以我们假设我们使用spring作为方便 交易管理框架。
1。处理交易的最佳地点在哪里???
显然,它不是您想要的数据访问对象的一部分 在一次交易中访问和更改多个对象。因此 必须在服务级别上应用事务处理 由spring框架提出。
但是假设你的业务逻辑做了类似的事情:
由于操作b可能需要不确定的时间长度,因此您不会 喜欢跨越此操作的事务,因为它将分配 宝贵的系统资源。因此,一些业务逻辑必须如此 与其他人分开。
这是否意味着服务层必须分为两层, 一个是交易的,一个不是???
2。如何修改和检索数据???
为了呈现表示层必须知道的数据 域对象。通过使用服务层授予的daos 访问这些objets到表示层。我看到两个问题 用这种方法。
a)我们假设hibernate被用作一个方便的ORM框架。 然后依赖项加载延迟,这对于大多数其他ORM都是如此 框架也是如此。所以我的视图代码试图访问我的复杂对象 可能会因为事务上下文而得到一些延迟加载异常 由服务层结束。
处理这种情况的正确方法是什么?
b)控制器通常使用一些框架魔术来应用 Web表单中的更改直接发送到我的模型对象。这又一次 在任何事务上下文之外,这意味着该服务 图层必须提供将模型对象重新附加到新图层的功能 交易并保存它们。
这真的是正确的方式???
期待您的回答......
答案 0 :(得分:0)
我不确定你所拥有的架构堆栈,但我遇到的最多的是Web Layer>服务层>数据层。也就是说,Web层通过服务层访问数据层。或者,您可以“直接”到服务层以获取数据层。
在这些类型的结构中,JTA事务(默认情况下启用时)默认配置为参与现有事务,或者启动自己的事务。在Spring中,这看起来像@Transactional
在服务层方法上注释(例如updateCustomer
)。如果Web层具有调用服务updateCustomerRequest
并且还调用updateCustomer
的控制器方法createAuditLogEvent
,并且所有这些必须在一个事务中完成,则Web层启动事务,服务层在其中参与,并且事务在createAuditLogEvent
之后在Web层中完成。如果直接调用服务层的updateCustomer
,则transactionManager仅围绕updateCustomer
方法启动新事务。
因此,通过使用服务层对数据层进行“最低级别访问”的模型,以及Web层通过服务层重用/访问,可以在各个层之间共享事务。