Intereting Posts
Сортировка нескольких таблиц MYSQL DateStamp PHP preg_split с двумя разделителями, если разделитель не находится в кавычках FTP-файл загрузки на удаленный сервер с CURL и PHP загружает пустой файл Хранить код html / php в переменной php ClassNotFoundException: Попытка загрузить класс «Mongo» из … (с сохранением) symfony2 Как прочитать эффективный URL ответа в Guzzle ~ 6.0 Какая хорошая стратегия для возобновления истечения срока действия бланка auth ticket между .net и php? Использование cURL и simpleXMLElement для извлечения данных. Как получить значение элемента XML после XPATH? Множественный выбор из двух соответствующих выпадающих меню Doctrine2 Querybuilder побитовый и Отправить img на сервер password_verify всегда неверный пароль, хотя пароль правильный Проверьте, существует ли база данных (MySQL), и если она не создается в PHP Как расшифровать хешированный пароль с помощью php? Преобразование на сегодняшний день в PHP из формата yyyymmdd

PDO :: beginTransaction () вызывает блокировку таблицы или строки до PDO :: commit ()?

У меня есть PHP-скрипт, который делает около 1000 вставок и 1000 обновлений каждого цикла, используя подготовленные операторы. Он зацикливается до тех пор, пока работа должна выполняться, иногда в течение нескольких часов, и вызывает проблемы с производительностью (включая исключения в тупике).

Я пытаюсь повысить производительность и просматриваю массовые вставки и обновления (хотя я все еще пытаюсь выяснить, как делать массовые обновления).

Когда PDO::beginTransaction() , просто ли он указывает классу PDO не отправлять запросы, исключенные с помощью PDO::execute() в базу данных, или отправляет запрос, а затем блокирует таблицы / строки, используемые до PDO::commit() вызывается?

Причина, по которой я спрашиваю, заключается в том, что PHP-скрипт занимает до 50 секунд каждого цикла, и он делает запросы на вставку и обновление за этот промежуток времени, поэтому я пытаюсь выяснить, могу ли я просто добавить PDO::beginTransaction() в начало скрипта и PDO::commit() в конце.

Solutions Collecting From Web of "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