Когда следует использовать транзакции MySQL?

Я прочитал несколько статей о том, когда я должен использовать транзакции. Я читаю:

Когда следует использовать транзакции? В принципе, каждый раз, когда у вас есть единица работы, которая либо чувствительна к внешним изменениям, либо нуждается в откате каждого изменения, если возникает ошибка или какая-то другая причина.

Но может ли кто-нибудь объяснить мне лучше?

  • Должен ли я начать транзакцию при выполнении двух или более запросов на удаление / обновление / вставку?
  • Должен ли я также начать транзакцию, когда у меня есть только один запрос на удаление / обновление / вставку?
  • Должен ли я начинать транзакцию, как 10 раз на странице, или лучше только один раз для всей страницы, или вы рекомендуете максимальную для каждой страницы (например, 5)?

Спасибо за вашу помощь!

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

Например, банк:

  • Клиент банка «Джон» перечисляет 100 долларов США на счет «Алисы».
  • В этом примере есть 2 запроса (я не показываю журнал или историю транзакций … и т. Д.). Вам нужно вычесть 100 долларов за баланс Джона и добавить это к балансу Алисы.
  • Start transaction
  • Вычитание из Джона
    • UPDATE accounts SET balance=balance-100 WHERE account='John'
  • Добавить в Алису
    • UPDATE accounts SET balance=balance+100 WHERE account='Alice'
  • commit

Транзакция не сохраняется до ее фиксации. Поэтому, если в любом запросе была ошибка, вы можете вызвать rollback и отменить любые запросы, которые были запущены с момента начала транзакции. Если по какой-то причине запрос на добавление $ 100 к Алисе не удался, вы можете откатить и не вычесть 100 долларов от Джона. Это способ обеспечить автоматическое отключение запросов при необходимости.


  • Должен ли я начать транзакцию при выполнении двух или более запросов на удаление / обновление / вставку?

    Зависит от того, что делают запросы.

  • Должен ли я также начать транзакцию, когда у меня есть только один запрос на удаление / обновление / вставку?

    Не требуется, если вам не нужен способ откат (отменить) запрос, как вы хотите сделать обновление, и проверить его до вызова commit (save).

  • Должен ли я начинать транзакцию, как 10 раз на странице, или лучше только один раз для всей страницы, или вы рекомендуете максимальную для каждой страницы (например, 5)?

    Начните столько, сколько вам нужно. Я бы сомневался, что у вас есть несколько транзакций на странице, так как вы, скорее всего, будете делать что-то на каждой загрузке страницы (т. Е. Переводить деньги).

Вы используете транзакции всякий раз, когда вам нужна группа связанных запросов, которые должны выполняться, как если бы это был только 1 запрос.

Например:

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

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

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

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

Вы также можете проверить запись в Википедии по этому вопросу:

http://en.wikipedia.org/wiki/Database_transaction