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

Transactions in php function or in mysql stored procedure?

开始交易的更好方式是什么? 内部程序或 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();
    }
}

如果我想每隔 minute/hour 以最快的速度 send/get 获取数据,这是个好方法吗?

这取决于您要实现的目标。

如果您想将所有插入都视为一个 'atomic operation',那么您做对了,就像对 SP 的一次调用失败一样,回滚将撤消之前调用所做的所有更改

如果,否则,您想要"isolate"每个单独的 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();

}