Php 多服务层和数据库事务

Php 多服务层和数据库事务,php,database,design-patterns,transactions,domain-driven-design,Php,Database,Design Patterns,Transactions,Domain Driven Design,我只是想知道如何最好地处理跨多个服务层的事务。服务层使用ORM存储和检索数据库。是否应该在各个服务层中知道和处理事务?还是应该由另一层来处理 例如:我为用户和客户端提供了两个服务层。我想: 1) 创建并保存新客户端 2) 创建并保存新用户 3) 将该用户分配给客户端 在单个事务中进行所有操作 一个简单的示例可能如下所示: $userManagementService = new UserManagementService; $newUserData = array(...); $newUser

我只是想知道如何最好地处理跨多个服务层的事务。服务层使用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);

事务逻辑应该去哪里?

您是否面临事务的聚合?这个伪代码和我想你说的相符吗

try
    begin application transaction
    begin ORM transaction 1
       create new user
       commit request
    begin ORM transaction 2
       create new client
       commit request
    begin ORM transaction 3
       create user client association
       commit request
    commit application tx
catch()
    abort ORM tx 3
    abort ORM tx 2
    abort ORM tx 1
    abort app tx
在任何时候,一个嵌套事务的回滚都可能抛出一个异常,这些异常在逻辑上会回滚该事务中的所有嵌套事务


我可能没有得到您想要的。

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

事务对于数据库连接是全局的。除非您的RDBMS本机支持嵌套事务,并且您的DB API公开嵌套事务,否则您可能会遇到异常情况

有关详细信息,请参阅我对的回答

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


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

Gotcha,这是有意义的。谢谢你的链接,这里有一些很好的解释。