У меня есть PHP-скрипт, который делает около 1000 вставок и 1000 обновлений каждого цикла, используя подготовленные операторы. Он зацикливается до тех пор, пока работа должна выполняться, иногда в течение нескольких часов, и вызывает проблемы с производительностью (включая исключения в тупике).
Я пытаюсь повысить производительность и просматриваю массовые вставки и обновления (хотя я все еще пытаюсь выяснить, как делать массовые обновления).
Когда PDO::beginTransaction()
, просто ли он указывает классу PDO не отправлять запросы, исключенные с помощью PDO::execute()
в базу данных, или отправляет запрос, а затем блокирует таблицы / строки, используемые до PDO::commit()
вызывается?
Причина, по которой я спрашиваю, заключается в том, что PHP-скрипт занимает до 50 секунд каждого цикла, и он делает запросы на вставку и обновление за этот промежуток времени, поэтому я пытаюсь выяснить, могу ли я просто добавить PDO::beginTransaction()
в начало скрипта и PDO::commit()
в конце.
На самом деле PDO::beginTransaction()
следует тем же правилам, что и инструкция START TRANSACTION
в MySQL, подробнее здесь .
Это означает, что MySQL не будет блокировать таблицу непосредственно, но будет следовать правилам ACID .
Обратите внимание, что если вам нужно явно заблокировать некоторые таблицы (таблицы), вы можете сделать:
$db->beginTransaction(); $db->exec('LOCK TABLES t1, t2, ...');
PDO::beginTransaction()
основном – autocommit mode
PDO::beginTransaction()
. Когда вы начинаете транзакцию ( $mydb->beginTransaction();
), это означает, что вы отключите PDO AutoCommit.
И это никогда не перестанет идти на транзакцию, пока вы не остановитесь с помощью Commit или Roll. например $mydb->commit();
Когда вы это прекратите, он снова превратится в автокоммутировать. Здесь вы можете контролировать транзакцию с фиксацией или откатом .
В связи с тем, что у вас есть огромные запросы для обработки, я предлагаю вам сделать это шаг за шагом на основе приоритетов следующим образом:
// start your transaction - means - stop auto commit. If(query1 gets successful){ If(query2 gets successful) { // Commit the transaction // stop the transaction } else { // Roll back the transaction } } else{ // Rollback the transaction }
Помните об использовании транзакции PDO, поскольку результат не может быть отменен. см. этот ref: http://php.net/manual/en/pdo.transactions.php