PDO回滚和beginTransaction,不能超过1个查询

时间:2016-10-18 09:00:11

标签: php mysql sql pdo rollback

第一个查询将成功执行,但对于第二个查询,它不起作用。 以下是我声明我的数据库并执行两个查询的编码:

$db = new PDO( "sqlsrv:server=$servername ; Database=$databasename", $UserId, $pwd);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$db->beginTransaction();

$sql2 = "INSERT INTO Header "
        . "(Number,Date)"
        . "VALUES (:Number, :Date)";

try 
{
   $stmt2 = $db->prepare($sql2);   
   $stmt2->bindParam("Number", $Number);
   $stmt2->bindParam("Date", $Date);
   $stmt2->execute();

   $sql3 = "UPDATE table2 
            SET Number= :Number
            WHERE Date= :Date ";

   try 
   {
      $stmt3 = $db->prepare($sql3);  
      $stmt3->bindParam("Number", $Number);
      $stmt3->bindParam("Date ", $Date );

      $stmt3->execute();
   } 
   catch(PDOException $e) 
   {
      $db->rollBack();
   }
   $db->commit();
} 
catch(PDOException $e) 
{
    $db->rollBack();
}

我在$db->setAttribute(PDO::ATTR_AUTOCOMMIT,0);将自动提交设置为false之前尝试,但是,它会显示the auto-commit mode cannot be changed for this driver错误消息。

1 个答案:

答案 0 :(得分:-1)

您不需要内部try ... catch子句,因为无论是第一个错误还是第二个错误都会触发回滚。 回到您的问题,MySQL可能无法执行您的更新语句,因为您的目标行未由唯一ID标识。 (不安全的更新)

您可以将安全更新检查点覆盖为:

SET SQL_SAFE_UPDATES =0;
do the update..
SET SQL_SAFE_UPDATES =1;

或在where子句中使用唯一标识符。