假设我有以下虚拟代码,该虚拟代码实际上将公司(客户)信息与所有相关对象一起复制粘贴:
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秒的时间(由于要处理的信息量很大)
最简单的方法是在请求方法时启动事务,并在完成时提交事务。但是我想这不是
正确的方法,但是我仍然想使所有内容保持完整,同时也避免死锁。因此,如果其中一个步骤失败,我希望将之前的步骤回滚。
任何好的建议如何正确处理这种情况?
答案 0 :(得分:0)
这不是答案,而是一些意见。
如果我说对了,您想实施从现有的创建新类操作。
创建新记录时,还没有发生真正危险的事情。
我建议您以这种方式转换代码:
try{
$newCompanyId = $this->createNewCompany($existingCompanyId);
$this->copyPasteClientObjects($companyId, $newCompanyId)
} catch(Exception $e){
this->deleteNewCompany($newCompanyId);
}
这样,您不需要任何事务,但是您的deleteNewCompany
应该还原已完成但尚未完成的所有操作。是的,创建该功能需要做更多的工作,但对我来说,将数据库阻塞10秒钟才有意义。
} catch(Exception $e){
并不是最佳实践,您需要定义一些特定于自定义案例的Exception
类型。像CopyPasteException
之类的。