标签:php database design-patterns transactions domain-driven-design
我只是想知道如何最好地处理跨多个服务层的事务.服务层使用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本身支持嵌套事务,并且您的DB API公开嵌套事务,否则您可能会遇到异常.
有关详细信息,请参阅我对How do detect that transaction has already been started?的回答
由于您使用的是PHP,因此您的交易范围最多只是一个请求.所以你应该只使用容器管理的事务,而不是服务层transa.也就是说,在处理请求开始时启动事务,并在完成处理请求时提交(或回滚).
如果需要回滚的异常发生在嵌套的ORM操作中,那么请使用Exception将其冒泡,然后让容器(即您的PHP操作控制器)处理它.
标签:php,database,design-patterns,transactions,domain-driven-design 来源: https://codeday.me/bug/20190627/1301391.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。