При разработке веб-приложений всегда необходим доступ к базе данных для выполнения таких операций, как запрос, вставка, обновление и удаление данных. В зависимости от логики приложения иногда необходимо объединить несколько инструкций по работе с базой данных в единицу работы (транзакцию). В базе данных транзакция относится к набору логических операционных единиц, которые преобразуют данные из одного состояния в другое. Чтобы обеспечить согласованность данных в базе данных, данные должны обрабатываться в дискретных группах логических единиц: когда все они завершены, согласованность данных может быть сохранена, но когда часть операции в единице завершается неудачей, вся операция завершается неудачно; транзакция будет игнорироваться, все операции, начиная с начальной точки, возвращаются в исходное состояние.
Фактически, каждая операция с базой данных по умолчанию является неявно транзакционной. В этой статье на примере типичной программы регистрации пользователей представлены три метода использования ASP для реализации обработки транзакций: решение, основанное на компонентах базы данных ASP, решение, основанное на механизме обработки транзакций внутри базы данных, и решение, основанное на компонентах MTS. .
Функции программы
Создайте две таблицы в базе данных SQL Server: таблицу USER и таблицу USERDOC. В таблице USER хранятся имя пользователя и пароль зарегистрированного пользователя, а в таблице USERDOC хранится личная информация зарегистрированного пользователя, индексированная по имени пользователя. Ниже приводится определение таблиц USER и USERDOC:
Создать таблицу USER(userName varchar(30),userPasswd varchar(30))
Создать таблицу USERDOC(userName varchar(30),Age int,Sex int,PhoneNumber varchar(20),Address varchar(50))
Когда пользователь запрашивает регистрацию, сценарий ASP сначала вставляет имя пользователя и пароль в таблицу USER, а затем в USERDOC Внесите в таблицу личную информацию пользователя (возраст, пол, контактный номер, домашний адрес и т.п.). В то же время приложение также должно гарантировать, что каждой записи в таблице USER соответствует соответствующая запись в таблице USERDOC.
Метод 1 использует объект Connection во встроенном компоненте ADO ASP для реализации транзакционной обработки операций базы данных. Некоторые методы объекта Connection следующие:
●Метод Connection.BeginTrans: запуск транзакции;
●Метод Connection.CommitTrans: завершить/отправить транзакцию;
●Метод Connection.RollBackTrans: отменить/отменить транзакцию.
//Начинаем операцию транзакции
<%Conn.BeginTrans%>
<% sqlText="Вставить в значения USER(userName,userPasswd)('" %>
<% sqlText=sqlText & request("usrName") & "','"&request("usrPasswd")&"') " %>
<% conn.execute(sqlText) %>
<% если conn.Errors.Count>0, то %>
<% conn.Errors.Clear %>
//Если операция вставки данных завершается неудачно, транзакция откатывается вперед
<% conn.RollBackTrans %>
<% response.Redirect RegisterFail.html %>
<% конец, если %>
<% sqlText="Вставить в USERDOC(имя пользователя,возраст,пол,номер телефона,адрес) "%>
<% sqlText=sqlText & "values('"& request ("usrName") & "', " & request("Age") %>
<% sqlText=sqlText & ",'" & request ("PhoneNum") & "','" %>
<% sqlText=sqlText & request("Адрес") & "') " %>
//Выполняем второй оператор вставки в единицу транзакции
<% conn.execute(sqlText) %>
<% если conn.Errors.Count>0, то %>
<% conn.Errors.Clear %>
//Если операция не удалась, транзакция откатывается вперед
<% conn.RollBackTrans %>
<% response.Redirect RegisterFail.html %>
<% конец, если %>
//Если вся операция транзакции выполнена правильно, фиксируем транзакцию
<% Conn.CommitTrans %>
//Переходим на страницу обработки успешной регистрации
<% response.Redirect RegisterOk.html %>
Метод 2 может использовать механизм обработки транзакций в системе базы данных для завершения обработки транзакций операций с данными путем написания хранимых процедур, содержащих транзакции, на сервере базы данных. В то же время, используя компонент ADO для вызова хранимой процедуры, вы также можете определить, успешно ли выполнена транзакция, на основе кода возврата хранимой процедуры.
В системе баз данных каждый оператор SQL является транзакцией. Таким образом, гарантировано, что каждый оператор либо завершится, либо вернется в начало. Однако если вы хотите, чтобы все операции набора операторов SQL были либо полностью завершены, либо все недействительны, для достижения этой цели вам необходимо использовать механизм обработки транзакций базы данных.
Основной код для создания хранимой процедуры в базе данных выглядит следующим образом:
Создайте процедуру RegisterUser (@usrName varchar(30), @usrPasswd varchar(30),@age int, @PhoneNum varchar(20), @Address varchar(50) ) в начале
//Показать определение и начать транзакцию
начать тран
вставить в значения USER(userName,userPasswd)(@usrName,@usrPasswd)
если @@error<>0
начинать
//Если операция не удалась, транзакция будет отменена
откат транзакций
//Возвращаемся к хранимой процедуре и устанавливаем код возврата для сбоя операции транзакции
вернуть -1
конец
вставьте в USERDOC(имя пользователя,возраст,пол,номер телефона,адрес)
значения(@Имя пользователя,@возраст,@PhoneNum,@Адрес)
если @@error<>0
начинать
//Если операция не удалась, транзакция будет отменена
откат транзакций
вернуть -1
конец
//Если операция выполнена правильно, фиксируем транзакцию
совершить тран
вернуть 0
конец
Основной код вызова хранимой процедуры базы данных в сценарии ASP выглядит следующим образом:
<% Set Comm=server.CreateObject
("ADODB.Команда") %>
<% Set Comm.ActiveConnection=conn %>
<% Comm.CommandType=adCmdStoredProc %>
<% Comm.CommandText="RegisterUser" %>
//Создаем хранимую процедуру для возврата объекта параметра
<% Set RetCode=Comm.CreateParameter
("RetCode",adInteger,adParamReturnValue) %>
//Создаем объект входного параметра хранимой процедуры
<% Set usrName=Comm.CreateParameter ("usrName",adVarchar,adParamInput,30) %>
<% Set usrPwd=Comm.CreateParameter
("usrPasswd",adVarchar,adParamInput,30) %>
<% Set age=Comm.CreateParameter("age",adInteger,adParamInput) %>
<% Set PhoneNum=Comm.CreateParameter
("PhoneNum",adVarchar,adParamInput, 20) %>
<% Set Address=Comm.CreateParameter("Address",adVarchar,adParamInput,50) %>
<% Comm.Parameters.Append usrName %>
<% Comm.Parameters.Append usrPwd %>
<% Параметры связи.Добавить возраст %>
<% Comm.Parameters.Append PhoneNum %>
<% Параметры связи.Добавить адрес %>
<% Comm.Parameters("usrName")=request("usrName") %>
<% Comm.Parameters("usrPasswd")=request("usrPasswd") %>
<% Comm.Parameters("возраст")=request("возраст") %>
<% Comm.Parameters("PhoneNum")=request("PhoneNum") %>
<% Comm.Parameters("Адрес")=request("Адрес") %>
<% Комм.Выполнить %>
<% RetValue=Cint(Comm("RetCode")) %>
//Определение успешности регистрации на основе кода возврата хранимой процедуры базы данных
<%, если RetValue< 0, то %>
<% response.Redirect RegisterFail.html %>
<% еще %>
<% response.Redirect RegisterOk.html %>
<% конец, если %>
Способ 3. При использовании механизма обработки транзакций компонента MTS (Microsoft Transaction Server) для реализации обработки транзакций следует обратить особое внимание на тот факт, что транзакции в рамках этого механизма не могут охватывать несколько страниц ASP, если для транзакции требуются объекты из нескольких компонентов. , Вы должны объединить операции над этими объектами на странице ASP.
Во-первых, вам нужно добавить директиву @TRANSACTION вверху страницы, чтобы объявить страницу ASP как транзакционную.
Директива @TRANSACTION должна находиться в первой строке страницы, иначе будет сгенерирована ошибка. Когда обработка сценария ASP на странице завершается, текущая транзакция завершается.
<%@ TRANSACTION=Требуемый язык=
VBScript%>
//Событие успешно вызвано выполнением транзакции
<% Sub OnTransactionCommit() %>
<% response.Redirect RegisterOk.html %>
<% Конец подзаголовка %>
//Событие срабатывает, когда что-то не выполняется
<% Sub OnTransactionAbort() %>
<% response.Redirect RegisterFail.html %>
<% Конец подзаголовка %>
<% sqlText="Вставить в значения USER(userName,userPasswd)('" %>
<% sqlText=sqlText & request("usrName") & "','" &request("usrPasswd")&"') " %>
<% conn.execute(sqlText) %>
<% если conn.Errors.Count>0, то %>
<% conn.Errors.Clear %>
<% ObjectContext.SetAbort %>
<% конец, если %>
<% sqlText="Вставить в USERDOC(имя пользователя,возраст,пол,номер телефона,адрес) "%>
<% sqlText=sqlText & "values('" & request("usrName")& "', " & request("Age") %>
<% sqlText=sqlText & ",'" & request("PhoneNum") & "','" %>
<% sqlText=sqlText & request("Адрес") & "') " %>
<% conn.execute(sqlText) %>
<% если conn.Errors.Count>0, то %>
<% conn.Errors.Clear %>
<% ObjectContext.SetAbort %>
<% конец, если %>
<% ObjectContext.SetComplete %>
Решение более гибкое. Метод использования компонентов базы данных ASP имеет определенные преимущества: вы можете использовать компоненты базы данных ADO для выполнения обработки транзакций, а также можете настроить свои собственные компоненты базы данных в соответствии с реальными потребностями (при условии, что они соответствуют компоненту ASP). напишу характеристики) Можно). Если вы учитываете надежность обработки транзакций базы данных, лучше использовать хранимую процедуру обработки транзакций внутри базы данных. Таким образом, механизм транзакций базы данных можно напрямую использовать для завершения обработки логических транзакций приложения, что является безопасным и надежным и уменьшает взаимодействие данных между веб-сервером и сервером базы данных. Это особенно важно для систем распределенных баз данных. Преимущество метода обработки транзакций с использованием компонентов MTS заключается в том, что сервер MTS напрямую контролирует и управляет завершением и отменой операций компонента (компонентов, зарегистрированных в MTS). Он имеет хорошее пространство для расширения и перспективы применения, а также может полностью раскрыть технические возможности. преимущества MTS. Повышение отказоустойчивости сетевых приложений и улучшение динамической производительности веб-серверов IIS.