Цикл лекций ASP (21) Создание транзакционных сценариев
Автор:Eve Cole
Время обновления:2009-05-30 19:58:32
Бизнес-приложения часто требуют возможности запуска сценариев и компонентов внутри транзакций. Транзакция — это операция сервера. Даже если операция включает в себя множество шагов (например, заказ, проверку запасов, оплату счетов и т. д.), она может возвращать только общий успех или неудачу операции. Пользователи могут создавать сценарии ASP, которые выполняются внутри транзакции. В случае сбоя какой-либо части сценария вся транзакция будет завершена.
Обработка транзакций ASP основана на сервере транзакций Microsoft (MTS). Microsoft Transaction Server (MTS) — это система обработки транзакций для разработки, настройки и управления высокопроизводительными, масштабируемыми и надежными корпоративными серверными приложениями Интернета и интрасети. Transaction Server предоставляет модель проектирования приложений для разработки распределенных компонентных приложений. Он также предоставляет среду выполнения для настройки и управления этими приложениями.
Возможность создания транзакционных сценариев встроена в Internet Information Server и Personal Web Server. Если у вас установлен Microsoft Transaction Server, вы можете упаковать компоненты так, чтобы они выполнялись внутри транзакции.
О транзакциях Транзакция — это общий успех или неудача операции. Обработка транзакций используется для надежного обновления базы данных. При внесении большого количества связанных изменений в базу данных или одновременном обновлении нескольких баз данных убедитесь, что все изменения выполняются правильно. Если какое-либо из этих изменений не удастся, необходимо восстановить исходное состояние таблиц базы данных.
Без MTS вам пришлось бы писать сценарии и компоненты для отслеживания запрошенных изменений вручную и восстановления данных в случае сбоя некоторых изменений. Используя MTS, вы просто объявляете свои сценарии и компоненты как «требующие транзакции» и позволяете MTS обеспечивать согласованность транзакций. Обработка транзакций применяется только к доступу к базе данных; MTS не может восстанавливать изменения в файловой системе или других нетранзакционных ресурсах. База данных, к которой обращается приложение, должна поддерживаться МТС. В настоящее время MTS поддерживает SQL Server и любой сервер, поддерживающий протокол XA (указанный ассоциацией X/Open). МТС продолжит расширять поддержку других баз данных.
Транзакции не могут охватывать несколько страниц ASP. Если для транзакции требуются объекты из нескольких компонентов, операции, использующие эти объекты, должны быть объединены на странице ASP. Например, предположим, что у вас есть компонент, который обновляет базу данных заработной платы, и компонент, который обновляет записи о сотрудниках в базе данных кадров. Чтобы записать новую информацию о зарплате сотрудника, вам необходимо написать сценарий, который вызывает эти два компонента в контексте транзакции: один для обновления базы данных заработной платы, а другой — для обновления уровня сотрудника в базе данных кадров.
Объявление транзакционных сценариев. Когда вы объявляете страницу как транзакционную, все команды сценария и объекты на странице выполняются в той же среде транзакций. Сервер транзакций обрабатывает детали создания транзакций и определяет, будет ли транзакция успешной (фиксируется) или неудачной (завершается). Чтобы объявить страницу как транзакционную, добавьте директиву @TRANSACTION вверху страницы:
<%@ ТРАНЗАКЦИЯ = значение %>
Параметр value может быть одним из следующих:
значение значения
Requires_New запускает новую транзакцию.
Обязательно запускает новую транзакцию.
Поддерживается, транзакция не запускается.
Not_Supported Не запускает транзакцию.
Директива @TRANSACTION должна находиться в первой строке страницы, иначе будет сгенерирована ошибка. Эту директиву необходимо добавить на каждую страницу, которая должна выполняться в рамках транзакции. Когда обработка сценария завершается, текущая транзакция завершается.
Большинству приложений требуется среда транзакций только для определенных операций. Например, сайту авиакомпании могут потребоваться только транзакционные сценарии для обработки билетов и рассадки, в то время как все остальные сценарии могут безопасно работать без транзакционной среды. Поскольку транзакции необходимо использовать только для страниц, требующих обработки транзакций, не объявляйте файл Global.asa вашего приложения транзакционным.
Если транзакция прерывается, Transaction Server отменяет любые изменения в ресурсах, поддерживаемых транзакциями. В настоящее время только серверы баз данных полностью поддерживают транзакции, поскольку данные в базе данных наиболее важны для корпоративных приложений. Сервер транзакций не восстанавливает изменения в файлах, переменных сеанса и приложения, коллекциях и т. д. на жестком диске. Однако вы можете создать сценарий восстановления переменных и коллекций, написав события транзакции, как описано в следующем разделе. В определенные моменты ваш сценарий также может явно зафиксировать или завершить транзакцию, например, при сбое записи данных в файл.
Сценарии фиксации или завершения. Поскольку Transaction Server отслеживает обработку транзакций, он определяет, была ли транзакция полностью успешной или неудачной. Сценарий может явно завершить транзакцию, вызвав ObjectContext.SetAbort. Например, скрипту необходимо завершить транзакцию, когда он получает сообщение об ошибке от компонента, нарушает бизнес-спецификации (например, баланс счета меньше 0) или завершается сбоем при выполнении нетранзакционных операций, таких как чтение и запись файлов. Если время ожидания страницы истекает до завершения транзакции, транзакция также должна быть прекращена.
Написание сценариев событий транзакции само по себе не определяет, будет ли транзакция успешной или неудачной. Однако вы можете написать события, которые вызываются, когда транзакция фиксируется или завершается. Например, если у вас есть сценарий, подтверждающий банковский счет, и вам нужно вернуть пользователю разные страницы для разных состояний транзакции, вы можете использовать события OnTransactionCommit и OnTransactionAbort, чтобы написать пользователю разные ответы.
<%@ ТРАНЗАКЦИЯ = Обязательно %>
<%
'Буферизация вывода, чтобы можно было отображать разные страницы.
Response.Buffer = Истина
%>
<HTML>
<ТЕЛО>
<H1>Добро пожаловать в онлайн-банкинг</H1>
<%
Установить BankAction = Server.CreateObject("MyExample.BankComponent")
BankAction.Deposit(Запрос("AcctNum"))
%>
<P>Спасибо. Ваша транзакция обрабатывается.</P>
</ТЕЛО>
</HTML>
<%
' Отображение этой страницы, если транзакция прошла успешно.
СубОнТранзакцияКоммит()
Ответ. Напишите «<HTML>»
Ответ. Напишите «<ТЕЛО>»
Ответ. Напишите «Спасибо. Ваш счет пополнен».
Ответ. Напишите "</BODY>"
Ответ. Напишите "</HTML>"
Ответ.Flush()
конец субтитра
%>
<%
' Отобразить эту страницу, если транзакция не удалась.
СубОнтранзакцияАборт()
Ответ.Очистить()
Ответ. Напишите «<HTML>»
Ответ. Напишите «<ТЕЛО>»
Ответ.Напишите «Мы не можем завершить вашу транзакцию».
Ответ. Напишите "</BODY>"
Ответ. Напишите "</HTML>"
Ответ.Flush()
Конец субтитра
%>
Регистрация компонента в диспетчере ресурсов MTS. Чтобы участвовать в транзакции, компонент должен быть зарегистрирован в пакете MTS и настроен на требование транзакций. Например, если ваш скрипт обрабатывает заказы, вызывая два компонента, один обновляет базу данных инвентаризации, а другой — базу данных платежей. Затем эти два компонента должны работать в одной и той же среде транзакций. Сервер транзакций гарантирует, что в случае сбоя какого-либо компонента база данных не будет обновлена. Некоторые компоненты не требуют транзакций, например компонент Ad Rotator.
Зарегистрируйте и настройте транзакционные компоненты с помощью MTS Resource Manager. В свойствах транзакции должно быть установлено значение «Требовать транзакцию» или «Требовать новую транзакцию». Компоненты транзакции должны быть зарегистрированы в пакете МТС. Вместо размещения компонентов во внутрипроцессных пакетах IIS создайте свои собственные пакеты. Обычно все компоненты следует размещать в библиотеке компонентов. Компоненты библиотеки компонентов могут использоваться несколькими приложениями ASP и запускаться в процессе приложения ASP. Используйте MTS Explorer, чтобы создать новый пакет и установить для свойства «Активация» пакета значение «Библиотека».
Транзакционные компоненты также можно зарегистрировать в пакете Сервер. Серверные пакеты обычно запускаются на сервере как отдельный процесс. Если вы хотите использовать проверку безопасности на основе функциональных групп или хотите, чтобы ваши компоненты были доступны приложениям на удаленных компьютерах, используйте пакет «Сервер» для транзакционных компонентов.
Для использования MTS Explorer необходимо установить Microsoft Transaction Server.
Область действия объекта Как правило, не храните объекты, созданные из компонентов MTS, в объектах приложения или сеанса ASP. Объекты МТС исчезают после завершения транзакции. Поскольку объект сеанса и объект приложения предназначены для экземпляров объектов, используемых между разными страницами ASP, не используйте их для хранения объектов, которые освобождаются в конце транзакции.
Сценарий ASP — это корень объявленной транзакции, отправная точка. Любой объект MTS, используемый транзакционной страницей ASP, считается частью транзакции. После завершения транзакции объекты MTS, используемые на странице, исчезнут, включая объекты, хранящиеся в объекте «Сессия» или «Приложение». После этого момента любая попытка вызвать объект области сеанса или приложения с другой транзакционной страницы завершится неудачей.
Очередь транзакций Обновления базы данных с удаленного сервера могут привести к задержке или прекращению транзакций из-за задержек или сбоев сети. Поскольку все части транзакции должны быть зафиксированы, приложение может зависнуть, ожидая сообщения о фиксации или отмене от удаленного сервера, или транзакция может быть прервана из-за невозможности отправки обновлений базы данных.
Для обновлений, которые должны выполняться одновременно, правильный подход — прекратить транзакцию или отложить ее завершение до тех пор, пока все участники транзакции не смогут ее зафиксировать. Например, процесс бронирования авиакомпании должен одновременно дебетовать банковский счет клиента и кредитовать банковский счет авиакомпании. Если обновление является частью общей транзакции, но может быть позже других обновлений, возможно, вы не захотите заставлять клиента ждать завершения всего процесса обновления. Например, транзакция бронирования авиабилета может также отправить заказ на еду поставщику продуктов питания или обновить командировочные расходы клиента. Хотя эти операции необходимо выполнить, их можно выполнить позже.
Сервер очереди сообщений Microsoft позволяет объединять обновление или набор обновлений в транзакционное сообщение, отправляемое на удаленный сервер. Сервер очереди сообщений гарантирует, что обновления будут отправлены на удаленный сервер, даже если сеть в данный момент недоступна. Ваше приложение получит сообщение о фиксации и сможет продолжить обработку транзакции.