Ao desenvolver aplicações web, é invariavelmente necessário acessar o banco de dados para concluir operações como consulta, inserção, atualização e exclusão de dados. Afetado pela lógica da aplicação, às vezes é necessário combinar múltiplas instruções de operação do banco de dados em uma unidade de trabalho (transação). Em um banco de dados, uma transação refere-se a um conjunto de unidades operacionais lógicas que transformam os dados de um estado para outro. Para garantir a consistência dos dados na base de dados, os dados devem ser operados em grupos discretos de unidades lógicas: quando tudo estiver concluído, a consistência dos dados pode ser mantida, mas quando parte da operação na unidade falhar, o todo; transação será ignorada, todas as operações do ponto inicial em diante serão retornadas ao estado inicial.
Na verdade, toda operação no banco de dados é implicitamente transacional por padrão. Este artigo toma como exemplo um programa típico de registro de usuário para apresentar três métodos de uso de ASP para implementar o processamento de transações: uma solução baseada em componentes de banco de dados ASP, uma solução baseada no mecanismo de processamento de transações dentro do banco de dados e uma solução baseada em componentes MTS. .
Funções do programa
Crie duas tabelas no banco de dados SQL Server: tabela USER e tabela USERDOC. A tabela USER armazena o nome de usuário e a senha do usuário cadastrado, e a tabela USERDOC armazena as informações pessoais do usuário cadastrado, indexadas pelo nome do usuário. A seguir está a definição das tabelas USER e USERDOC:
Criar tabela USER(userName varchar(30),userPasswd varchar(30))
Criar tabela USERDOC(userName varchar(30),Age int,Sex int,PhoneNumber varchar(20),Address varchar(50))
Quando o usuário solicita o registro, o script ASP primeiro insere o nome de usuário e a senha na tabela USER e, em seguida, no USERDOC Insira as informações pessoais do usuário (idade, sexo, número de contato, endereço residencial, etc.) na tabela. Ao mesmo tempo, a aplicação também deve garantir que cada registro na tabela USER tenha um registro correspondente na tabela USERDOC.
O Método 1 usa o objeto Connection no componente ADO interno do ASP para implementar o processamento transacional de operações de banco de dados. Alguns métodos do objeto Connection são os seguintes:
●Método Connection.BeginTrans: inicia uma transação;
●Método Connection.CommitTrans: completar/enviar uma transação;
●Método Connection.RollBackTrans: Desfaz/abandona uma transação.
//Iniciar uma operação de transação
<%Conn.BeginTrans%>
<% sqlText="Inserir em USER(userName,userPasswd) valores('" %>
<% sqlText=sqlText & request("usrName") & "','"&request("usrPasswd")&"') " %>
<% conn.execute(sqlText) %>
<% se conn.Errors.Count>0 então%>
<% conn.Errors.Clear %>
//Se a operação de inserção de dados falhar, a transação retrocede
<% conn.RollBackTrans %>
<% resposta.Redirct RegisterFail.html %>
<% fim se %>
<% sqlText="Inserir em USERDOC(nomedeusuário,Idade,Sexo,Número de telefone,Endereço) "%>
<% sqlText=sqlText & "values('"& request ("usrName") & "', " & request("Idade") %>
<% sqlText=sqlText & ",'" & request ("PhoneNum") & "','" %>
<% sqlText=sqlText & request("Endereço") & "') " %>
//Executa a segunda instrução de inserção na unidade de transação
<% conn.execute(sqlText) %>
<% se conn.Errors.Count>0 então%>
<% conn.Errors.Clear %>
//Se a operação falhar, a transação retrocede
<% conn.RollBackTrans %>
<% resposta.Redirct RegisterFail.html %>
<% fim se %>
//Se toda a operação da transação for executada corretamente, confirme a transação
<%Conn.CommitTrans%>
//Vá para a página de processamento de sucesso de registro
<% resposta.Redirct RegisterOk.html %>
O Método 2 pode usar o mecanismo de processamento de transações dentro do sistema de banco de dados para concluir o processamento de transações de operações de dados, escrevendo procedimentos armazenados contendo transações no servidor de banco de dados. Ao mesmo tempo, usando o componente ADO para chamar o procedimento armazenado, você também pode determinar se a transação foi executada com êxito com base no código de retorno do procedimento armazenado.
Em um sistema de banco de dados, cada instrução SQL é uma transação. Portanto, é garantido que cada instrução será concluída ou retornará ao início. No entanto, se você deseja que as operações de um conjunto de instruções SQL sejam todas concluídas ou inválidas, será necessário usar o mecanismo de processamento de transações do banco de dados para conseguir isso.
O código principal para gerar o procedimento armazenado no banco de dados é o seguinte:
Crie proc RegisterUser (@usrName varchar(30), @usrPasswd varchar(30),@age int, @PhoneNum varchar(20), @Address varchar(50) ) como início
//Exibe a definição e inicia uma transação
começar a trans
insira em valores de USER(userName,userPasswd)(@usrName,@usrPasswd)
se @@erro<>0
começar
//Se a operação falhar, a transação será revertida
reverter tran
//Retorna ao procedimento armazenado e define o código de retorno para falha na operação de transação
retornar -1
fim
insira em USERDOC (nome de usuário, idade, sexo, número de telefone, endereço)
valores(@Usrname,@age,@PhoneNum,@Address)
se @@erro<>0
começar
//Se a operação falhar, a transação será revertida
reverter tran
retornar -1
fim
//Se a operação for executada corretamente, confirmamos a transação
cometer trans
retornar 0
fim
O código principal para chamar o procedimento armazenado do banco de dados no script ASP é o seguinte:
<% Definir Comm=server.CreateObject
("ADODB.Command") %>
<% Definir Comm.ActiveConnection=conn %>
<% Comm.CommandType=adCmdStoredProc %>
<% Comm.CommandText="RegisterUser" %>
//Cria procedimento armazenado para retornar objeto de parâmetro
<% Definir RetCode=Comm.CreateParameter
("RetCode",adInteger,adParamReturnValue) %>
//Cria objeto de parâmetro de entrada de procedimento armazenado
<% Definir usrName=Comm.CreateParameter ("usrName",adVarchar,adParamInput,30) %>
<% Definir usrPwd=Comm.CreateParameter
("usrPasswd",adVarchar,adParamInput,30) %>
<% Definir idade=Comm.CreateParameter("idade",adInteger,adParamInput) %>
<% Definir PhoneNum=Comm.CreateParameter
("NumTelefone",adVarchar,adParamInput, 20) %>
<% Definir Endereço=Comm.CreateParameter("Endereço",adVarchar,adParamInput,50) %>
<% Comm.Parameters.Append usrName %>
<% Comm.Parameters.Append usrPwd %>
<% Comm.Parameters.Append idade %>
<% Comm.Parameters.Append PhoneNum %>
<% Comm.Parameters.Append Endereço %>
<% Comm.Parameters("usrName")=request("usrName") %>
<% Comm.Parameters("usrPasswd")=request("usrPasswd") %>
<% Comm.Parameters("idade")=request("idade") %>
<% Comm.Parameters("NumTelefone")=request("NumTelefone") %>
<% Comm.Parameters("Endereço")=request("Endereço") %>
<% Comm.Executar %>
<% RetValue=Cint(Comm("RetCode")) %>
//Determina se o registro foi bem-sucedido com base no código de retorno do procedimento armazenado do banco de dados
<% se RetValue< 0 então %>
<% resposta.Redirect RegisterFail.html %>
<% mais %>
<% resposta.Redirect RegisterOk.html %>
<% fim se %>
Método 3: Ao usar o mecanismo de processamento de transações do componente MTS (Microsoft Transaction Server) para implementar o processamento de transações, atenção especial deve ser dada ao fato de que as transações sob esse mecanismo não podem abranger várias páginas ASP se uma transação exigir objetos de vários componentes. , Você deve combinar as operações nesses objetos em uma página ASP.
Primeiro, você precisa adicionar a diretiva @TRANSACTION no topo da página para declarar uma página ASP como transacional.
A diretiva @TRANSACTION deve estar na primeira linha de uma página, caso contrário será gerado um erro. Quando o processamento do script ASP na página termina, a transação atual termina.
<%@ TRANSACTION=Idioma obrigatório=
VBScript%>
//Evento disparado com sucesso pela execução da transação
<% Sub OnTransactionCommit()%>
<% resposta.Redirect RegisterOk.html %>
<% Fim Sub %>
//Evento acionado quando alguma coisa falha na execução
<% Sub OnTransactionAbort() %>
<% resposta.Redirect RegisterFail.html %>
<% Fim Sub %>
<% sqlText="Inserir em USER(userName,userPasswd) valores('" %>
<% sqlText=sqlText & request("usrName") & "','" &request("usrPasswd")&"') " %>
<% conn.execute(sqlText) %>
<% se conn.Errors.Count>0 então%>
<% conn.Errors.Clear %>
<%ObjectContext.SetAbort%>
<% fim se %>
<% sqlText="Inserir em USERDOC(nomedeusuário,Idade,Sexo,Número de telefone,Endereço) "%>
<% sqlText=sqlText & "values('" & request("usrName")& "', " & request("Idade") %>
<% sqlText=sqlText & ",'" & request("NumTelefone") & "','" %>
<% sqlText=sqlText & request("Endereço") & "') " %>
<% conn.execute(sqlText) %>
<% se conn.Errors.Count>0 então %>
<% conn.Errors.Clear %>
<%ObjectContext.SetAbort%>
<% fim se %>
<% ObjectContext.SetComplete %>
A solução é mais flexível. O método de usar componentes de banco de dados ASP tem certas vantagens: você pode usar componentes de banco de dados ADO para concluir o processamento de transações e também pode personalizar seus próprios componentes de banco de dados de acordo com as necessidades reais (desde que atendam ao componente ASP). especificações de escrita) pode). Se você considerar a confiabilidade do processamento de transações do banco de dados, é melhor usar o procedimento armazenado de processamento de transações dentro do banco de dados. Desta forma, o mecanismo de transação do banco de dados pode ser usado diretamente para completar o processamento lógico da transação do aplicativo, que é seguro e confiável e reduz a interação de dados entre o servidor Web e o servidor de banco de dados. Isto é especialmente importante para sistemas de banco de dados distribuídos. A vantagem do método de processamento de transações usando componentes MTS é que o servidor MTS controla e gerencia diretamente a conclusão e desfazer das operações dos componentes (componentes registrados no MTS). Possui bom espaço de expansão e perspectivas de aplicação, e pode dar pleno desempenho ao técnico. vantagens do MTS Melhore o desempenho de tolerância a falhas de aplicativos de rede e melhore o desempenho dinâmico dos servidores web IIS.