多个服务层和数据库事务

2023-12-14

我只是想知道如何最好地处理跨多个服务层的事务。服务层使用 ORM 来存储和检索数据库。交易是否应该在各个服务层内被了解和处理?或者它们应该由另一层处理?

例如:我有两个针对用户和客户端的服务层。我想:

1)创建并保存新客户端
2)创建并保存新用户
3)将该用户分配给客户端

全部在一次交易中完成。

一个简单的例子可能如下所示:

$userManagementService = new UserManagementService;
$newUserData = array(...);
$newUser = $userManagementService->create($newUserData);

$clientManagementService = new ClientManagementService;
$newClientData = array(...);
$newClient = $clientManagementService->create($newClientData);

$userManagementService->assignUserToClient($newUser, $newClient);

事务逻辑应该去哪里?


不要尝试在服务层或 ORM 内执行嵌套事务。

事务对于数据库连接来说是全局的。除非您的 RDBMS 本身支持嵌套事务and如果您的数据库 API 公开了嵌套事务,您可能会遇到异常情况。

详情请看我的回答如何检测交易已经开始?

由于您使用的是 PHP,因此事务范围至多是单个请求。因此,您应该只使用容器管理的事务,而不是服务层事务。也就是说,在开始处理请求时启动事务,并在处理完请求时提交(或回滚)。

如果需要回滚的异常发生在嵌套 ORM 操作的深处,则使用异常将其冒泡,并让容器(即 PHP 操作控制器)处理它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多个服务层和数据库事务 的相关文章

  • 如何在 PHP 中知道种子/对等点的数量

    当您放置一个 torrent文件在您的网站上下载 您如何获取该 Torrent 的种子和同级数量并通知用户 您必须联系 torrent 文件中显示的跟踪器 如果跟踪器支持 抓取 这可能就是您想要的请求 否则 由跟踪器决定要返回多少个对等点给
  • 文件再次获取内容不起作用替代方案

    我尝试了curl 因为file get contents在php中不起作用 任何人都可以给我解决方案 所以使用curl解决它 这里是代码 userData json decode file get contents https graph
  • 字符串的正则表达式,必须至少包含 14 个字符,其中至少 2 个数字,至少 6 个字母

    我需要一个正则表达式来测试字符串的 最少 14 个字符 有效值为A Za z0 9 这 14 个字母中至少有 6 个字母 这 14 个数字中至少有 2 个 有没有一种方法可以将其包装在一个正则表达式中 目前我有一个 javascript 和
  • java 中带有子类化的单例

    在 Java 中实现单例的最常见方法是使用私有构造函数和以下形式的公共访问器方法 public class Singleton private static Singleton instance null private Singleton
  • Facebook 墙写应用

    我想知道我是否可以编写一个应用程序 它可以是我所有朋友的列表 只需在我选择的朋友的墙上发布一条消息即可 不是消息 而是墙上的帖子 所以看来我去了他们的墙并写了一条消息 他们不知道有一个应用程序正在向他们推送消息 也可以用 python 编写
  • 在php mysql排行榜表中显示用户排名?

    我创建了一个测验页面 将登录用户的测验结果存储到排行榜 我有一个名为 Members 的表 其中包含 user 和 quiz score 列 我根据登录用户进行的测验结果打印出排行榜 我在个人资料页面的排行榜中显示特定用户的位置时遇到问题
  • Firestore 每秒向一个集合写入 500 多次以上

    Firestore 的限制为每秒 500 次写入 to 一个集合 其中文档包含顺序值 索引字段 https cloud google com firestore quotas writes and transactions https cl
  • 多个提交按钮

    我在 HTML 和 PHP 中遇到多个提交按钮时遇到问题 我尝试为基于 Web 的计算器编写 GUI 代码 这确实很容易 但是 php 中的函数并不那么容易 所以我有这个简单的 GUI 有 6 个提交按钮
  • Memcached 获取慢、CPU 使用率高

    我在机器上运行了一个 memcached 实例来承受数据库的压力 目前 通过 PHP 每秒约有 350 个请求 根据 memcached 文档 这应该是完全可行的 但我发现 get 时间慢得离谱 平均约为 60 毫秒 双向都有峰值 0 1
  • 让 PHPUnit 忽略一些事情?

    我有一个 PHPUnit 测试类 我希望在测试运行中忽略它 我知道我可以通过重命名它来做到这一点 以便它的文件名中不包含 测试 一词 但我不想这样做 因为它比我想要的更混乱了源代码控制水域 有人有建议吗 有几个选项phpunit命令可以帮助
  • Sphinx错误:搜索请求中未知的本地索引“INDEX_NAME”[已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我使用 Sphinx 0 9 9 r
  • PHP 数组 ASC 排序

    我正在尝试对以下数组进行排序 但由于某些奇怪的原因 它似乎不起作用 sizearray Array 0 gt 39 1 gt 40 2 gt 41 3 gt 42 4 gt 43 5 gt 44 6 gt 45 7 gt 39 8 gt
  • session_regenerate_id(true) ajax 请求或快速刷新时的无效会话

    为了避免会话固定 我在每个 PHP 页面的开头使用以下代码 session set cookie params 900 domain 1 1 session start session regenerate id true 但如果页面刷新太
  • Monolog:如何捕获所有错误和异常

    我错过了一些非常明显的东西 如何让 monolog 记录所有 php 错误 php 用户错误和异常 在使用 monolog 之前 我编写了自己的函数并将其传递给set error handler register shutdown func
  • CakePHP:无法访问 MySQL 数据库

    我是 CakePHP 的新手 刚刚完成配置过程 但很困惑为什么 Cake 无法访问我的 MySQL 数据库 Cake 信息页面显示我的 tmp 目录是可写的 FileEngine 正在用于缓存 不知道这意味着什么 并且我的数据库配置文件存在
  • 编辑表单以清理/验证电话号码

    我对 PHP 的经验非常有限 我真的希望有人可以帮助我 我想要做的是清理 验证输入的电话号码 以便只允许使用数字 我想我需要使用FILTER SANITIZE NUMBER INT但我不确定在哪里或如何使用它 这是我的代码
  • 丰富的领域模型和 ORM

    Martin Fowler 认为贫血领域模型是一种反模式 将持久性模型作为域模型进行滚动似乎也严重偏离 因为对象关系阻抗不匹配 http en wikipedia org wiki Object Relational impedance m
  • npm run dev 和 npm run production 之间的区别

    我对 Laravel 和 vue js 很陌生 请让我知道它们之间有什么区别npm run dev and npm run production 这和环境有关系吗 npm run dev创建源映射并且不会缩小 js css 这使得调试和查找
  • print_r 的替代方案(仅显示最多 2 3 个键)

    我有一个multi dimensional array有 200 个键 每个键有 3 到 5 个数组 我想知道有什么方法可以只看到有限的部分 即最多 3 或 4 个键 因为如果我使用print r desiredArray 然后花费了太多时
  • 如何将react-native与php一起使用并获取返回数据始终为空

    我的回报始终为空 我似乎无法让它发挥作用 我如何将react native与php一起使用并获取json 任何人都可以帮忙吗 PHP myArray array myArray lat POST lat myArray lng POST l

随机推荐

  • 强制对声明进行函数评估

    我有一个函数f x y z Limit g x eps y z eps gt 0 我绘制f x y z 在下一步中 早些时候 我曾经评估极限并复制定义中的表达式f 我试图一步完成这一切 然而 只有当我尝试绘制时 才会对极限进行评估f 因此
  • 将 jQuery流沙与 fancybox 结合使用时出现问题

    我正在使用流沙 jQuery 的这个例子 制作精美的 HTML5 作品集 现在 我想在单击图像时打开灯箱 为此 我使用 fancybox jQuery 但问题在于这个 Making a Beautiful HTML5 Portfolio q
  • 由外键控制的值

    我在 SQL Server 中有一个非常简单的数据库 包含以下三个表 Theater ID is3D 其他值 Show ID Theater ID Movie ID date time 其他值 Movie ID is3D 其他值 我想确保3
  • Java-分割字母数字字符串

    输入示例 RC23 CC23QQ21HD32 BPOASDf91A5HH123 输出示例 RC 23 CC 23 QQ 21 HD 32 BPOASDf 91 A 5 HH 123 字母部分和数字部分的长度不固定 我知道如何将 split
  • 带有局部变量的 Mockito

    我有一个简单的方法 返回一个String 它还创建了一个本地List 我想测试一下给本地带来的附加值List 这是一个例子 package com impl import java util ArrayList import java ut
  • Android:setSelection 对 Spinner 没有影响

    我在 Spinner 上使用 setSelection 时遇到一些问题 我将值设置为在代码中显示微调器时预先选择 但它没有任何效果 并且始终选择列表中的第一个替代项 代码如下所示 LayoutInflater li LayoutInflat
  • 在 Flash 中,当 e4x 语句存储在字符串中时,我将如何运行该语句?

    所以我有这样的事情 var xmlStatement String xmlObject node 3 thisValue 我必须使用什么神秘函数才能执行 xmlStatement 并从该 xmlObject 获取 thisValue 喜欢
  • 统计 Android 中的应用程序使用情况

    谁能帮我确定如何计算应用程序在 Android 中的使用次数 写入 SharedPreference onCreate 这不会是一个非常准确的计数 因为 onCreate 有时会被调用 而不仅仅是应用程序启动 但它会是一个相当不错的数字 如
  • 需要将具有相同ID的多行数据转换为1行多列数据

    我回顾了已经解决的问题的版本 但是我发现的一些好的技巧 例如 在 分区 上使用rank 似乎不适用于我所在的Sybase版本 我希望运行一个程序来提取按如下方式组织的数据 电子邮件 偏爱电子邮件1 偏好XYZ电子邮件1 偏好ABC 并将其呈
  • 从 Windows 批处理文件替换文本文件中的字符

    我正在尝试编写一个批处理文件 它将查看一个小文本文件 实际上是一个 CUE 表 中的每个字符 并执行三件事 删除所有问号 用连字符替换任何斜杠 并用两个冒号替换冒号连字符 如下例中的第二行 TRACK 01 AUDIO TITLE Colo
  • NextAuth /api/auth/* 在 Vercel 部署上始终返回 404,但在本地工作

    每当我尝试导航到登录页面时 它都会重定向到 api auth error关于 vercel 部署 在本地 它按预期导航和工作 通过检查网络选项卡 第一个失败的网络请求是 api auth providers 不太确定哪里出了问题 pages
  • 上下文不保存更改并出现错误 1550

    我正在尝试更新实体并保存更改 我总是收到以下错误 The operation couldn t be completed Cocoa error 1550 Method BOOL updateEvent EventDTO eventDTO
  • SCNNode 没有出现在正确的位置

    我下载了wall2 obj来自 Google Blocks 的文件 然后我使用 Blender 将扩展名更改为 dae墙节点没有出现在它应该出现的地方 墙节点放置的位置与应放置的位置 枢轴点位置问题 在搅拌机中改变pivot point的位
  • 如何从 Spring data MongoDB 中的 AggregationOperation 列表创建聚合?

    我想创建一个可以在 MongoOperations 的aggregate 函数中使用的聚合 因此 为了创建聚合 我使用了 AggregationOperation 列表 如下所示 ApplicationContext ctx new Ann
  • 从 JavaScriptExecutor 的 ExecuteScript 获取值

    我有一个需要价值的问题 string someValue IJavaScriptExecutor Global Driver ExecuteScript publication title val Console WriteLine som
  • Symfony2 +Vagrant 性能 - 运行缓慢 - 加速?

    我已经开始使用 vagrant 和 Symfony2 来开发 Web 项目 我使用的是Windows 性能非常慢 因为不支持nfs挂载 我已将缓存放入内存中 这提供了异国情调的提升 禁用了 xdebug 如发布的here 然而 在 Wind
  • 角度形式数组单选按钮

    我正在尝试将单选按钮组添加到 FormArray 问题是 当我选择一个值时 它会更改 FormArray 每个成员的值 我知道这与 formControlName 有关 但是我不知道如何使 formControlName 动态化 我看过这个
  • 如何检查 BigQuery 表中的 JSON 对象列中是否存在空值

    我参考了 GCP Big 查询文档 如下链接所示 但没有成功实现使用这些函数从 Big 查询表中检索非空值 JSON 数据类型列值的目标 参考帮助 https cloud google com bigquery docs reference
  • ReactJS:通过 props 从父级改变子级状态

    免责声明 我已经看过Reactjs 如何修改父级的子状态或道具 并且不相信答案符合我的问题 所以我有一个可重用的 有状态的对话组件 它根据其状态呈现不同的 DOM 我还必须能够控制从父级渲染哪个 DOM TL DR 我应该如何改变父组件的子
  • 多个服务层和数据库事务

    我只是想知道如何最好地处理跨多个服务层的事务 服务层使用 ORM 来存储和检索数据库 交易是否应该在各个服务层内被了解和处理 或者它们应该由另一层处理 例如 我有两个针对用户和客户端的服务层 我想 1 创建并保存新客户端2 创建并保存新用户