控制器中的数据库事务


DB Transaction in Controllers

我创建了一个crud系统。在这里,我有一个主模型,然后是依赖的细节模型。因此,在与父模型相关的详细模型中输入了多行(有时> 100(。所有操作都通过网格处理(内联编辑(。因此,创建、更新、删除操作是通过单个请求执行的(通过数据库进行逻辑检查(。

现在我正在考虑将数据库事务用于整个操作。但是我很困惑,我如何使用相同的结构来实现这一点。我已经有建议将所有代码移动到一个模型,因此事务可以在那里应用。但我在想,是否有任何其他方法可用于保留主模型代码和细节模型代码的分离。

您是使用 AJAX 进行更改还是依赖于手动表单提交?

您可以使用所谓的工作单元模式。

保存用户对网格的每一行所做的任何更改,但实际上不要将它们提交到数据库。然后,在页面上放置一个遗传保存按钮,该按钮将导致您的服务器通过事务实际提交所有更改。

您可以保留用户更改的每一行的列表服务器端。您不需要跟踪所有行,因为如果它们不更改任何内容,则无需保存任何内容。

您在模型中使用哪种方法? 你的模型是否知道它们自己的持久性(你是否做$user->save()之类的事情(,或者你是否在做一种更数据映射的方法($userManager->save($userEntity)(? 后者使事务处理变得更加容易。

如果您正在执行活动记录类型的模式($user->save()(,则最好的选择可能只是手动获取数据库连接并在控制器中管理事务。

如果你正在做数据映射器的东西,你有更多的选择,包括做一个完整的工作单元实现。

至于我的最后一条评论,将代码移动到父模型是我现在的解决方案。所以我想我应该标记这个线程回答。