php - 从 PHP 端处理 MySQL 事务:策略和最佳实践
问题描述
假设我有以下虚拟代码,实际上将公司(客户)信息与所有相关对象复制粘贴:
class Company extends BaseModel{
public function companyCopyPaste($existingCompanyId)
{
$this->db->transaction->start();
try{
$newCompanyId = $this->createNewCompany($existingCompanyId);
$this->copyPasteClientObjects($companyId, $newCompanyId)
$this->db->transaction->commit();
} catch(Exception $e){
this->db->transaction->rollback();
}
}
...
}
方法copyPasteClientObjects
内部包含很多逻辑,比如选择/更新现有数据、聚合和保存。此外,整个过程可能需要长达 10 秒才能完成(由于要处理大量信息) 最简单的方法是在方法的请求中启动事务并在完成后提交。但我想这不是正确的方法,但我仍然想保持一切完整,同时也避免死锁。因此,如果其中一个步骤失败,我希望回滚之前的步骤。
有什么好的建议如何正确处理这种情况?
解决方案
这不是一个答案,而是一些意见。
如果我猜对了,您想实现从现有类型创建新的操作。
当您创建新记录时,还没有发生真正危险的事情。
我建议您以这种方式转换代码:
try{
$newCompanyId = $this->createNewCompany($existingCompanyId);
$this->copyPasteClientObjects($companyId, $newCompanyId)
} catch(Exception $e){
this->deleteNewCompany($newCompanyId);
}
这样您就不需要任何交易,但您deleteNewCompany
应该恢复已完成但未完成的所有事情。是的,创建该功能需要做更多的工作,但对我来说,阻塞 DB 10 秒更有意义。
而且} catch(Exception $e){
恕我直言不是最佳实践,您需要定义一些自定义案例特定Exception
类型。喜欢CopyPasteException
什么的。
推荐阅读
- three.js - Orbit Controls 不是构造函数
- r - 检查两个数据帧在 R 中的同一行和同一列是否具有相同的值
- mysql - 查询MySQL中的一系列连续事件
- php - 使用 PHP 和 FuelPHP MVC 框架在布尔值上调用成员函数 format()
- ios - NSBundle iOS 13 中的内存泄漏
- flutter - Provider 中的监听器在 Flutter 中是如何工作的?
- ios - 当我尝试使用 segue 使按钮显示不同的视图控制器时,它会在顶部添加一个黑条
- kotlin - Gradle Kotlin Script,尝试通过内置变量分配类补丁
- deno - 如何产生子进程并与它通信 Deno?
- android - 是否可以从 Java/Kotlin 中的 android WorkManager 类启动广播接收器