经理/交易的目的是啥?
Posted
技术标签:
【中文标题】经理/交易的目的是啥?【英文标题】:What is the purpose of Managers / Transactions?经理/交易的目的是什么? 【发布时间】:2011-03-01 22:51:15 【问题描述】:我是第一次构建 Spring 应用程序。我遇到了很多并发问题,我怀疑我管理后端的方式有问题。我看到的后端代码和我见过的示例之间的唯一区别是管理器类。
在我的代码中,我有我的模型(由 hibernate 管理)和我的 DAO 以在模型上执行 CRUD/搜索/等。在我看过的示例代码中,他们从不直接使用 DAO。相反,他们使用间接调用 DAO 的管理器类。对我来说,这似乎是毫无意义的代码重复。
这些经理类有什么用?我读过他们将我的代码包装在“事务”中,但我为什么要这样做?
【问题讨论】:
您能否发布一个示例或指向使用这些管理器的示例的链接? 【参考方案1】:事务用于使更新“事务性”。
示例)用户单击一个网页,导致数据库中更新了 13 条记录。事务将确保 0 或 13 次更新通过,错误将使其全部回滚。
经理必须让事情变得更容易做。它们不会神奇地使您的代码线程安全。直接使用 DAO 本身并不是线程安全错误。
但是,我建议您限制 DAO 中的逻辑,并将尽可能多的逻辑放在业务层中。见Best practice for DAO pattern?
如果您发布的代码可能不能很好地与多线程一起使用的小示例,我们可以提出一些建议……但单独的事务和管理器都无法解决您的问题。
【讨论】:
长时间运行的事务通常看起来是“并发”问题,因为其他线程会命中打开事务的(数据库)锁。 非常正确。需要更多细节来看看这是否是他所说的问题【参考方案2】:许多应用程序有非平凡的需求,业务逻辑通常涉及对多个资源(例如多个 DAO)的访问、这些访问的协调以及跨这些访问的事务控制(如果您访问 DAO1 和 DAO2,您想要提交或回滚变化作为一个不可分割的工作单元)。
因此,通常将这种复杂性封装并隐藏在专用的服务组件中,以粗粒度的方式向客户端公开业务行为。
这正是您所指的经理们正在做的事情,他们构成了Service Layer。
服务层从连接客户端层的角度定义了应用程序的边界 [Cockburn PloP] 及其可用操作集。它封装了应用程序的业务逻辑,控制事务并在其操作的实现中协调响应。
【讨论】:
【参考方案3】:DAO 不应拥有交易,因为他们无法知道自己是否只是更大交易的一部分。
服务层是事务所属的地方。你说它们是“毫无意义的代码重复”是不正确的。
【讨论】:
以上是关于经理/交易的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章
创建一个对 3 天销售交易求和并计算 3 天销售交易的函数的最佳方法是啥?