php函数或mysql存储过程中的事务?

时间:2015-06-12 12:59:14

标签: php mysql pdo transactions

什么是开始交易的更好方法? 内部程序或PHP函数?

例如我像这样调用MySQL程序:

function sendLeaguesToDb(){ 
    $leagues = "";
    try{
        $this->PDO->beginTransaction();
        $stmt = $this->PDO->prepare("call insupd_Leagues(:id,:name,:country,:sport_id,:his_data,:fixtures,:livescore,
        :numofmatches,:latestmatch)");
        $leagues=$this->soccer->GetAllLeagues();
        foreach($leagues as $key=>$value){
           $stmt->bindParam(':id',$value->Id);
           $stmt->bindParam(':name',$value->Name);  
           $stmt->bindParam(':country',$value->Country);
           $stmt->bindParam(':sport_id',$value->Sport_Id);
           $stmt->bindParam(':his_data',$value->Historical_Data);
           $stmt->bindParam(':fixtures',$value->Fixtures);
           $stmt->bindParam(':livescore',$value->Livescore);
           $stmt->bindParam(':numofmatches',$value->NumberOfMatches);
           $stmt->bindParam(':latestmatch',$value->LatestMatch);
           $stmt->execute();
           $this->PDO->commit();
        }
    }
    catch(XMLSoccerException $e){
        echo "XMLSoccerException: ".$e->getMessage();
    }
    catch(PDOException $e){
        echo "PDOException: ".$e->getMessage();
        $this->PDO->rollback();
    }
}

如果我想以每分钟/小时最快的速度发送/获取数据,那么这是好方法吗?

1 个答案:

答案 0 :(得分:2)

这取决于你想要达到的目标。

如果您希望将所有插入视为'原子操作',那么您就是正确的,就好像对SP的一次调用失败一样,回滚将撤消之前调用所做的所有更改

否则,如果您想“隔离”每个SP呼叫,确保如果结果存储在数据库中,则必须在SP内开始和结束事务

我认为首选的解决方案是第一个

编辑:我现在要注意的一件事:提交应该在for之后:

try{
    $this->PDO->beginTransaction();
    $stmt = $this->PDO->prepare("call insupd_Leagues(:id,:name,:country,:sport_id,:his_data,:fixtures,:livescore,
    :numofmatches,:latestmatch)");
    $leagues=$this->soccer->GetAllLeagues();
    foreach($leagues as $key=>$value){
       $stmt->bindParam(':id',$value->Id);
       $stmt->bindParam(':name',$value->Name);  
       $stmt->bindParam(':country',$value->Country);
       $stmt->bindParam(':sport_id',$value->Sport_Id);
       $stmt->bindParam(':his_data',$value->Historical_Data);
       $stmt->bindParam(':fixtures',$value->Fixtures);
       $stmt->bindParam(':livescore',$value->Livescore);
       $stmt->bindParam(':numofmatches',$value->NumberOfMatches);
       $stmt->bindParam(':latestmatch',$value->LatestMatch);
       $stmt->execute();

    }    
   //move your commit here   
   $this->PDO->commit();

}