В информатике обработка транзакций — это обработка информации [1] , которая делится на отдельные, неделимые операции, называемые транзакциями . Каждая транзакция должна быть успешной или неудачной как целостная единица; она никогда не может быть завершена лишь частично.
Например, когда вы покупаете книгу в интернет-магазине, вы обмениваете деньги (в форме кредита ) на книгу. Если у вас хороший кредит, серия связанных операций гарантирует, что вы получите книгу, а книжный магазин получит ваши деньги. Однако, если одна операция в серии не сработает во время обмена, весь обмен не сработает. Вы не получите книгу, а книжный магазин не получит ваши деньги. Технология, отвечающая за сбалансированность и предсказуемость обмена, называется обработкой транзакций . Транзакции гарантируют, что ориентированные на данные ресурсы не будут постоянно обновляться, если все операции в пределах транзакционной единицы не завершатся успешно. Объединив набор связанных операций в единицу, которая либо полностью успешна, либо полностью неудачна, можно упростить восстановление после ошибок и сделать свое приложение более надежным.
Системы обработки транзакций состоят из компьютерного оборудования и программного обеспечения, размещающего ориентированное на транзакции приложение, которое выполняет рутинные транзакции, необходимые для ведения бизнеса. Примерами служат системы, которые управляют вводом заказов на продажу, бронированием авиабилетов, расчетом заработной платы, записями сотрудников, производством и доставкой.
Поскольку большая часть (хотя и не обязательно вся) обработки транзакций сегодня является интерактивной, этот термин часто рассматривается как синоним онлайн-обработки транзакций .
Обработка транзакций предназначена для поддержания целостности системы (обычно базы данных или некоторых современных файловых систем ) в известном, согласованном состоянии, гарантируя, что все взаимозависимые операции в системе либо успешно завершаются, либо все успешно отменяются.
Например, рассмотрим типичную банковскую транзакцию, которая включает в себя перемещение $700 со сберегательного счета клиента на текущий счет клиента. Эта транзакция включает в себя по крайней мере две отдельные операции в компьютерных терминах: дебетование сберегательного счета на $700 и кредитование текущего счета на $700. Если одна операция будет успешной, а другая нет, в книгах банка не будет баланса в конце дня. Следовательно, должен быть способ гарантировать, что либо обе операции будут успешными, либо обе не будут успешными, чтобы в базе данных банка в целом не было никаких несоответствий.
Обработка транзакций связывает несколько отдельных операций в одну неделимую транзакцию и гарантирует, что либо все операции в транзакции будут завершены без ошибок, либо ни одна из них. Если некоторые операции завершены, но при попытке выполнить другие возникают ошибки, система обработки транзакций «откатывает» все операции транзакции (включая успешные), тем самым стирая все следы транзакции и восстанавливая систему до согласованного, известного состояния, в котором она находилась до начала обработки транзакции. Если все операции транзакции завершены успешно, транзакция фиксируется системой , и все изменения в базе данных становятся постоянными; транзакцию нельзя откатить после того, как это будет сделано.
Обработка транзакций защищает от аппаратных и программных ошибок, которые могут привести к частичному завершению транзакции. Если компьютерная система выходит из строя в середине транзакции, система обработки транзакций гарантирует, что все операции в любых незавершенных транзакциях будут отменены.
Обычно транзакции выполняются одновременно. Если они пересекаются (т. е. должны затрагивать одну и ту же часть базы данных), это может привести к конфликтам. Например, если у клиента, упомянутого в примере выше, есть 150 долларов на сберегательном счете, и он пытается перевести 100 долларов другому человеку, одновременно переводя 100 долларов на текущий счет, только одна из них может быть успешной. Однако принудительная последовательная обработка транзакций неэффективна. Поэтому параллельные реализации обработки транзакций запрограммированы на то, чтобы гарантировать, что конечный результат отражает бесконфликтный результат, такой же, который мог бы быть достигнут при последовательном выполнении транзакций в любом порядке (свойство, называемое сериализуемостью ). В нашем примере это означает, что независимо от того, какая транзакция была выполнена первой, либо перевод другому человеку, либо перевод на текущий счет будет успешным, а другая — нет.
Базовые принципы всех систем обработки транзакций одинаковы. Однако терминология может различаться в зависимости от системы обработки транзакций, и термины, используемые ниже, не обязательно являются универсальными.
Системы обработки транзакций обеспечивают целостность базы данных, записывая промежуточные состояния базы данных по мере ее изменения, а затем используя эти записи для восстановления базы данных до известного состояния, если транзакция не может быть зафиксирована. Например, копии информации в базе данных до ее изменения транзакцией откладываются системой до того, как транзакция сможет внести какие-либо изменения (иногда это называется образом до ). Если какая-либо часть транзакции терпит неудачу до ее фиксации, эти копии используются для восстановления базы данных до состояния, в котором она была до начала транзакции.
Также можно вести отдельный журнал всех изменений в системе управления базами данных (иногда называемый after images ). Это не требуется для отката неудачных транзакций, но полезно для обновления системы управления базами данных в случае сбоя базы данных, поэтому некоторые системы обработки транзакций предоставляют его. Если система управления базами данных полностью выходит из строя, ее необходимо восстановить из последней резервной копии. Резервная копия не будет отражать транзакции, совершенные с момента создания резервной копии. Однако после восстановления системы управления базами данных журнал after images может быть применен к базе данных ( rollforward ), чтобы обновить систему управления базами данных. Любые транзакции, которые выполнялись на момент сбоя, затем могут быть откатены. Результатом является база данных в согласованном, известном состоянии, которая включает результаты всех транзакций, совершенных до момента сбоя.
В некоторых случаях две транзакции могут в ходе своей обработки пытаться получить доступ к одной и той же части базы данных одновременно, таким образом, что это не позволяет им продолжить работу. Например, транзакция A может получить доступ к части X базы данных, а транзакция B может получить доступ к части Y базы данных. Если в этот момент транзакция A затем попытается получить доступ к части Y базы данных, в то время как транзакция B попытается получить доступ к части X, произойдет взаимоблокировка , и ни одна из транзакций не сможет двигаться дальше. Системы обработки транзакций разработаны для обнаружения этих взаимоблокировок, когда они происходят. Обычно обе транзакции будут отменены и откатятся, а затем они будут запущены снова в другом порядке автоматически, так что взаимоблокировка не возникнет снова. Или иногда только одна из заблокированных транзакций будет отменена, откатится и автоматически перезапущена после небольшой задержки.
Взаимоблокировки могут также возникать между тремя или более транзакциями. Чем больше транзакций вовлечено, тем сложнее их обнаружить, вплоть до того, что системы обработки транзакций обнаруживают, что существует практический предел взаимоблокировок, которые они могут обнаружить.
В системах, где механизмы фиксации и отката недоступны или нежелательны, для отмены неудачных транзакций и восстановления системы до предыдущего состояния часто используется компенсирующая транзакция .
Джим Грей определил свойства надежной транзакционной системы в конце 1970-х годов под аббревиатурой ACID — атомарность, согласованность, изоляция и долговечность. [1]
Изменения состояния транзакции являются атомарными: либо происходят все, либо не происходит ни одного. Эти изменения включают изменения базы данных, сообщения и действия на преобразователях.
Согласованность : транзакция — это корректное преобразование состояния. Действия, выполняемые как группа, не нарушают никаких ограничений целостности, связанных с состоянием.
Несмотря на то, что транзакции выполняются одновременно, для каждой транзакции T создается впечатление, что другие транзакции были выполнены либо до T, либо после T, но не одновременно.
После успешного завершения транзакции (фиксации) ее изменения в базе данных сохраняются даже при сбоях.
Стандартное программное обеспечение для обработки транзакций , такое как IBM Information Management System , было впервые разработано в 1960-х годах и часто было тесно связано с конкретными системами управления базами данных . Клиент-серверные вычисления реализовали схожие принципы в 1980-х годах с переменным успехом. Однако в последние годы распределенную модель клиент-сервер стало значительно сложнее поддерживать. Поскольку число транзакций росло в ответ на различные онлайн-сервисы (особенно Интернет ), единая распределенная база данных не была практичным решением. Кроме того, большинство онлайн-систем состоят из целого набора программ, работающих совместно, в отличие от строгой клиент-серверной модели, где один сервер мог бы обрабатывать транзакции. Сегодня доступно несколько систем обработки транзакций, которые работают на межпрограммном уровне и которые масштабируются до больших систем, включая мэйнфреймы .
Одной из таких попыток является X/Open Distributed Transaction Processing (DTP) (см. также Java Transaction API (JTA)). Однако фирменные среды обработки транзакций, такие как CICS от IBM , по-прежнему очень популярны, [ необходима ссылка ], хотя CICS также развился и включает в себя открытые отраслевые стандарты.
Термин экстремальная обработка транзакций (XTP) использовался для описания систем обработки транзакций с необычно сложными требованиями, в частности требованиями к пропускной способности (транзакций в секунду). Такие системы могут быть реализованы с помощью распределенных или кластерных архитектур. Он использовался по крайней мере до 2011 года. [2] [3]