Транзакции PDO с таблицами InnoDB - PullRequest
0 голосов
/ 04 октября 2011

У меня есть таблицы InnoDB, к которым мы получаем доступ через API PDO из PHP. Теперь я прочитал, что для операторов INSERT и UPDATE было бы неплохо использовать транзакции InnoDB. Поскольку для автоматической фиксации установлено значение 1, запрос будет зафиксирован сразу после его выполнения. Так что, если я сгруппирую кучу INSERT вместе и сделаю:

$GLOBALS['dbh']->query('BEGIN');
[multiple INSERT queries here]
$GLOBALS['dbh']->query('COMMIT');

Это должно быть более эффективным.

Вопросы:

  1. Это правильно?
  2. Я также читал, что некоторые API используют свои собственные транзакции, и мне было интересно, знает ли кто-нибудь, что это делает PDO. Другими словами, должен ли я вообще беспокоиться об этом или позволить PDO обрабатывать транзакции?
  3. В случае, если PDO обрабатывает транзакции, я все испорчу с вышеуказанными запросами?

Спасибо.

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Это правильно?

Да.
Небольшой придира: я бы использовал START TRANSACTION вместо begin, это то же самое, но более очевидное.

Я также читал, что некоторые API используют свои собственные транзакции, и мне было интересно, знает ли кто-нибудь, выполняет ли это PDO.Другими словами, должен ли я вообще беспокоиться об этом или позволить PDO обрабатывать транзакции?

PDO волшебным образом не знает, когда ваши транзакции начинаются и заканчиваются, поэтому вам все равно придется начинать и заканчивать транзакции, если auto-commit = 1, и вы хотите включить более 1 оператора в транзакцию.
Вы не должны беспокоиться, что вы делаете выше, это нормально.

В случае, если PDO обрабатывает транзакции, я все испорчу с вышеуказанными запросами?

Нет.

Так что, если я сгруппирую кучу INSERT и сделаю: {см. Код выше} Это должно быть более эффективно.

Не очень, если вы можете объединить все свои вставки в одном утверждении , что будет более эффективным.
И если вы можете заменить вставку на load data infile это было бы еще эффективнее.

Пример:

INSERT INTO table1 (field1, field2) VALUES (1,1),(2,5),(5,6);
-- Much more efficient than 3 separate inserts 
-- (and you don't need to start and end the transaction :-)
0 голосов
/ 01 марта 2013

Теоретически это правильно, но "официальный" способ сделать это - использовать для этого встроенные методы PDO: http://www.php.net/manual/en/pdo.begintransaction.php

...