,假设我有以下的虚拟代码,实际上复制了使用所有相关对象的company(客户端)信息:
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){
IMHO不是最佳实践,您需要定义某些自定义案例的Exception
类型。喜欢CopyPasteException
或其他。