Какие различия я должен учитывать при использовании транзакций MySQL? - PullRequest
2 голосов
/ 05 января 2010

Мне недавно сказали, что я должен использовать транзакции в своем приложении, поскольку они могут помочь быстрее выполнять код и предотвратить выполнение кода MySQL до загрузки всей страницы (например, если кто-то просто обновляет мою страницу, а вся страница не ' t загрузка, никакие вызовы MySQL не начнутся, и это уменьшит нагрузку на сервер.)

Мне интересно, хочу ли я переключить свой сайт на транзакции, насколько это будет сложно, и какие изменения мне придется внести?

Кроме того, я использую PDO, а не mysql_*, если это что-то изменит?

Ответы [ 4 ]

4 голосов
/ 05 января 2010

Транзакции в веб-приложениях обычно используются для атомарности и для изоляции .


Они не « препятствуют выполнению кода MySQL до загрузки всей страницы: запросы MySQL по-прежнему выполняются, когда вы вызываете mysql_query (или любой эквивалент с использованием PDO или mysqli_*) . Но все они будут "отменены", если вы не совершите транзакцию.

Они также не имеют ничего общего с тем, как помочь " выполнять код быстрее "; даже если иногда они могут иметь такой эффект, это только потому, что если вы явно не используете транзакцию для группы запросов (в результате чего получается только одна транзакция) , MySQL неявно будет использовать одну транзакцию для каждого запроса (что приводит к нескольким транзакциям, которые могут создать дополнительную нагрузку на сервер БД)

Примечания:

  • Конечно, это использует механизм БД, который поддерживает транзакции - как InnoDB.
  • для "более быстрой" точки, я видел это пару раз; но это было в особых ситуациях, когда мне нужно было скорость больше, чем ACID - или, может быть, это просто вопрос нагрузки на сервер (что означает, что если вы хотите пойти по этому пути, вам нужно профилировать, чтобы знать, что быстрее в ваш конкретный случай!)


Использование PDO, mysql_* или mysqli_* не должно иметь большого значения, даже если мы рекомендуем не использовать mysql_* (старый и не поддерживает некоторые функции MySQL> = 4.1, например, подготовленные заявления) .

1 голос
/ 05 января 2010

На самом деле вы используете транзакции уже , когда используете СУБД. Однако, если вы не явно о том, когда транзакции начинаются и заканчиваются, вы неявно позволяете каждому оператору SQL запускать и завершать отдельную транзакцию. Это также называется «автоматическая фиксация».

Транзакции являются хорошим инструментом для создания логических наборов изменений с помощью нескольких операторов SQL, поэтому вы можете зафиксировать или откатить весь набор изменений как единое целое и гарантировать, что ваши изменения оставят базу данных в согласованном состоянии. Транзакции не предназначены в первую очередь для повышения производительности.

Есть небольшие накладные расходы для начала и завершения любой транзакции. Это увеличивается, если вы используете неявные транзакции для больших изменений, что приводит к накладным расходам для каждого оператора. Например, это становится значительным, если вы выполняете тысячи операторов INSERT для выполнения массовой загрузки данных, каждый INSERT неявно в отдельной транзакции. В других случаях выигрыш в производительности от использования транзакций по сравнению с неиспользованием транзакций является тривиальным, особенно в таком языке, как PHP, который имеет архитектуру «без участия».

0 голосов
/ 05 января 2010

Мне не известна скорость транзакций в MySQL, но в SQLite, как правило, быстрее использовать транзакции, однако я считаю, что в MySQL они должны замедлять вас.

Что касается изменений, которые нужно внести, ну ... Почти нет:

BEGIN TRANSACTION
$result = [execution of several queries]
if $result fails -> ROLLBACK, else COMMIT

Я также предлагаю вам использовать PDO поверх mysqli или mysql.

0 голосов
/ 05 января 2010

Транзакции предоставляют ACID, а не ускоряют ваш код.

Если что, они сделают это медленнее. Я предлагаю вам больше изучить транзакции, прежде чем делать такой вывод.

...