Платформы корпоративных информационных систем



              

Транзакции



Транзакции


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

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

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

Практический пример использования транзакций - банковское приложение, в котором перевод средств со сберегательного на чековый счет выполняется в результате изменения остатка на сберегательном счете, а затем изменения остатка на чековом счете. Это можно осуществить с помощью двух команд SQL:

# Снять $100 из $110 на сберегательном счете

UPDATE account

SET balance = 10.00

WHERE id = 1234

# Добавить $100 к $55 на чековом счете

UPDATE account

SET balance = 155.00

WHERE id = 5678

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

Объединяя эти две команды в транзакцию, вы говорите, что либо обе должны быть успешно выполнены, либо ни одна из них. Если первая команда пройдет, а вторая не сможет выполниться, то можно дать команду, называемую «откат»(«rollback»), которая вернет базу данных в состояние, предшествовавшее началу транзакции. Точно так же никому не разрешается трогать файлы, которые вы модифицируете, пока работа не будет завершена. MySQL частично позволяет эмулировать транзакции, используя команду LOCK TABLES. Блокировки помогают избежать нарушения целостности данных, но не дают возможности осуществления операции отката. В mSQL поддержка транзакций отсутствует.









Содержание  Назад  Вперед