Я изучал транзакции и, насколько я понимаю, мой оператор множественной вставки должен работать.
Я использую движок InnoDB. Оба оператора вставки, приведенные ниже, работают и правильно вводят данные в соответствующие таблицы, но только если у меня есть один из них одновременно в транзакции, а не оба вместе.
Может ли кто-нибудь сказать мне, что мне нужно делать по-другому?
Не работает с Affected rows (INSERT): -1
код:
$con->begin_transaction();
$con->autocommit(FALSE);
$query = "
INSERT INTO `Order` (`PO`,`SellingManagerSalesRecordNumber`,`OrderID`,
`AmountPaid`,`CreatedTime`,`Subtotal`,`Total`,`BuyerUserID`,
`IsMultiLegShipping`,`Status_id`,`SellerUserID_id`)
VALUES
('AF11514','11514','111809902234-1906167668001','55.98',
'2019-01-07 17:42:46','55.98','55.98','hyccas3','false',
(SELECT `id` FROM `Status` WHERE `Status` = 'Completed'),
(SELECT `id` FROM `SellerUserID` WHERE `SellerUserID` = 'afiperformance'))
ON DUPLICATE KEY UPDATE PO = VALUES(PO),
SellingManagerSalesRecordNumber = VALUES(SellingManagerSalesRecordNumber),
OrderID = VALUES(OrderID),
AmountPaid = VALUES(AmountPaid),
CreatedTime = VALUES(CreatedTime), Subtotal = VALUES(Subtotal),
Total = VALUES(Total),
BuyerUserID = VALUES(BuyerUserID),
IsMultiLegShipping = VALUES(IsMultiLegShipping);
INSERT INTO `CheckoutStatus` (`PO`,`LastModifiedTime`,
`PaymentMethod_id`,`Status_id`)
VALUES ('AF11514','2019-01-07 17:47:55',
(SELECT `id` FROM `PaymentMethod` WHERE `PaymentMethod` = 'PayPal'),
(SELECT `id` FROM `Status` WHERE `Status` = 'Complete'))
ON DUPLICATE KEY UPDATE PO = VALUES(PO),
LastModifiedTime = VALUES(LastModifiedTime);";
echo $query;
$con->query($query);
printf("<br><br>\n\nAffected rows (INSERT): %d ", $con->affected_rows) . "\n\n<br><br>";
if ($con->affected_rows == -1) {
echo "<br><br>\n\n Failed " . "\n\n<br><br>";
$con->rollback();
$commit = '';
} else {
$commit = $con->commit();
echo " success " . "\n\n<br><br>";
}
/* commit transaction */
if ($commit == '') {
print("Transaction commit failed\n");
} else {
print("Transaction commit success\n");
}
$con->close();






mysqli_query не поддерживает несколько запросов за один вызов. Вам нужно либо использовать mysqli_multi_query, либо разделить запрос на два отдельных вызова mysqli_query. Поскольку вы используете транзакции, было бы лучше разделить вызовы на два, поскольку получить информацию об ошибках для второго и последующих запросов в mysqli_multi_query сложно.
Нет. Просто звоните mysqli_query по одному оператору за раз.
@Mike вызов mysqli_multi_query не эквивалентен использованию транзакций. Вы все равно должны их использовать.
@RickJames, вы говорите, поместите каждый оператор SQL в отдельный $con->query();, верно? Я делал это так, и это сработало, но я думал, что транзакции отправляют все данные сразу, и если я отправляю их по одному в собственном $con->query();, то кажется, что я побеждаю цель использования транзакций?
@Mike совсем нет, смысл использования транзакций в том, чтобы позволить вам откатить эффект транзакций, если какая-либо из них не удалась.
Если вы начнете транзакцию, все последующие операторы будут частью этой транзакции, пока вы не зафиксируете или не откатитесь. Вам не нужно отправлять отчеты за один звонок. Фактически, у вас может не получиться, если вам нужно выполнить больше операторов SQL в одной транзакции, чем может поместиться в один пакет. Верхнего предела количества операторов в одной транзакции нет, но есть верхний предел размера одного пакета.
Бывший технический директор MySQL сказал мне: «В буквальном смысле нет причин для существования множественных запросов».
И создатель PHP сказал: «Не используйте его». Если вы это допускаете, вы просто даете хакеру еще один (довольно простой) способ проникнуть в вашу систему.
Тогда мне все еще нужно использовать транзакции? Или достаточно
mysqli_multi_query?