我只是想知道如何最好地处理跨多个服务层的事务。服务层使用 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(使用前将#替换为@)