从PHP端处理MySQL事务:策略和最佳实践

时间:2018-12-19 17:00:18

标签: 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秒的时间(由于要处理的信息量很大) 最简单的方法是在请求方法时启动事务,并在完成时提交事务。但是我想这不是 正确的方法,但是我仍然想使所有内容保持完整,同时也避免死锁。因此,如果其中一个步骤失败,我希望将之前的步骤回滚。

任何好的建议如何正确处理这种情况?

1 个答案:

答案 0 :(得分:0)

这不是答案,而是一些意见。

如果我说对了,您想实施从现有的创建新类操作。

创建新记录时,还没有发生真正危险的事情。

我建议您以这种方式转换代码:

     try{
        $newCompanyId = $this->createNewCompany($existingCompanyId);
        $this->copyPasteClientObjects($companyId, $newCompanyId)
    } catch(Exception $e){
        this->deleteNewCompany($newCompanyId);
    }

这样,您不需要任何事务,但是您的deleteNewCompany应该还原已完成但尚未完成的所有操作。是的,创建该功能需要做更多的工作,但对我来说,将数据库阻塞10秒钟才有意义。

} catch(Exception $e){并不是最佳实践,您需要定义一些特定于自定义案例的Exception类型。像CopyPasteException之类的。