Транзакции. Свойства ACID.

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

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

Фиксация и откат транзакции.

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

А теперь давайте продемонстрируем пример использования транзакций в СУБД MySQL (в большинстве популярных СУБД этот механизм кардинально ничем не отличается):

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

Транзакция начинается с ключевого слова BEGIN. Два оператора UPDATE внутри транзакции являются часть одной транзакции и могут быть выполнены либо оба одновременно либо ни один из них (должен произойти откат). Команда COMMIT служит для указания окончания транзакции и о фиксации изменений. Если фиксация прошла успешна, то все изменения в исходной БД будут отображены.

Чтобы выполнить откат транзакции можно явно записать команду ROLLBACK.

Свойства ACID.

Итак, мы познакомились с понятием транзакции, фиксации и отката. Теперь давайте рассмотрим четыре очень важных свойства транзакции, о которых частенько любят спрашивать на собеседованиях. Требования ACID в конце 70-х годов сформулировал Джим Грей(лауреат Премии Тьюринга за вклад в развитие баз данных). И вот как они звучат:

  • Atomicity — атомарность. То, о чем мы говорили выше. транзакция атомарна, то есть все действия, выполняемые в рамках одной транзакции, это единое целое.
  • Consistency — согласованность. Каждая новая транзакция переводит базу данных из одного согласованного состояния в другое. Если ваша БД распредленная, то все ее реплики должны содержать одну и ту же версию данных для обеспечения доступности. Это правило часто нарушается многими NoSQL базами данных.
  • Isolation — изолированность. Транзакции не влияют друг на друга. В случае параллельного выполнения не должно происходить частичного обновления данных.
  • Durability — надежность. Вы же хотите чтобы в случае сбоев все изменения, внесенные данной транзакцией все же сохранились? Именно поэтому в данном списке есть свойство надежности.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *