从PHP方面处理MySQL交易:策略和最佳实践



,假设我有以下的虚拟代码,实际上复制了使用所有相关对象的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或其他。

最新更新