第一个查询将成功执行,但对于第二个查询,它不起作用。 以下是我声明我的数据库并执行两个查询的编码:
$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
错误消息。
答案 0 :(得分:-1)
您不需要内部try ... catch子句,因为无论是第一个错误还是第二个错误都会触发回滚。 回到您的问题,MySQL可能无法执行您的更新语句,因为您的目标行未由唯一ID标识。 (不安全的更新)
您可以将安全更新检查点覆盖为:
SET SQL_SAFE_UPDATES =0;
do the update..
SET SQL_SAFE_UPDATES =1;
或在where子句中使用唯一标识符。