Первый запрос будет выполнен успешно, но для второго он не работает.
Ниже приведена кодировка, которую я объявляю своей базе данных и выполняю два запроса:
$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);
Однако, это показывает the auto-commit mode cannot be changed for this driver
сообщение об ошибке.
Вам не нужно внутреннее предложение try … catch, потому что 1-я или 2-я ошибка в любом случае вызовут откат.
Вернуться к вашему вопросу, MySQL может не выполнить ваш оператор обновления, поскольку целевые строки не идентифицируются уникальным идентификатором. (небезопасное обновление)
Вы можете переопределить контрольную точку безопасного обновления как:
SET SQL_SAFE_UPDATES =0;
do the update..
SET SQL_SAFE_UPDATES =1;
или используйте уникальные идентификаторы в предложении where.
Других решений пока нет …