Série de palestras ASP (21) Criando scripts transacionais
Autor:Eve Cole
Data da Última Atualização:2009-05-30 19:58:32
Os aplicativos de negócios geralmente exigem a capacidade de executar scripts e componentes dentro de transações. Uma transação é uma operação de servidor, mesmo que a operação inclua muitas etapas (por exemplo, fazer pedidos, verificar estoque, pagar contas, etc.), ela só pode retornar o sucesso ou fracasso geral da operação. Os usuários podem criar scripts ASP que são executados dentro de uma transação. Se qualquer parte do script falhar, toda a transação será encerrada.
O processamento de transações ASP é baseado no Microsoft Transaction Server (MTS). O Microsoft Transaction Server (MTS) é um sistema de processamento de transações para desenvolver, configurar e gerenciar aplicativos de servidor corporativos de Internet e intranet de alto desempenho, escalonáveis e robustos. O Transaction Server fornece um modelo de design de aplicativos para o desenvolvimento de aplicativos distribuídos baseados em componentes. Ele também fornece um ambiente de tempo de execução para configurar e gerenciar esses aplicativos.
A capacidade de criar scripts transacionais está incorporada no Internet Information Server e no Personal Web Server. Se você tiver o Microsoft Transaction Server instalado, poderá empacotar componentes para que sejam executados dentro de uma transação.
Sobre Transações Uma transação é o sucesso ou fracasso geral de uma operação. O processamento de transações é usado para atualizar o banco de dados de maneira confiável. Ao fazer muitas alterações relacionadas em um banco de dados ou atualizar vários bancos de dados simultaneamente, certifique-se de que todas as alterações sejam executadas corretamente. Se alguma dessas alterações falhar, o estado original das tabelas do banco de dados precisará ser restaurado.
Sem o MTS, você precisaria escrever scripts e componentes para rastrear manualmente as alterações solicitadas a fim de recuperar os dados caso algumas alterações falhassem. Usando o MTS, você simplesmente declara seus scripts e componentes como "exigindo transações" e deixa o MTS lidar com a consistência transacional. O processamento de transações se aplica apenas ao acesso ao banco de dados; o MTS não pode recuperar alterações no sistema de arquivos ou em outros recursos não transacionais. O banco de dados acessado pelo aplicativo deve ser suportado pelo MTS. Atualmente, o MTS oferece suporte ao SQL Server e a qualquer servidor que suporte o protocolo XA (especificado pela X/Open Association). A MTS continuará a expandir o suporte para outros bancos de dados.
As transações não podem abranger várias páginas ASP. Se uma transação exigir objetos de vários componentes, as operações que utilizam esses objetos deverão ser combinadas em uma página ASP. Por exemplo, suponha que você tenha um componente que atualiza um banco de dados de folha de pagamento e um componente que atualiza registros de funcionários em um banco de dados de recursos humanos. Para registrar novas informações salariais de um funcionário, é necessário escrever um script que chame esses dois componentes em um contexto de transação, um para atualizar o banco de dados da folha de pagamento e outro para atualizar a nota do funcionário no banco de dados de recursos humanos.
Declarando scripts transacionais Quando você declara uma página como transacional, quaisquer comandos de script e objetos na página são executados no mesmo ambiente de transação. O Transaction Server trata dos detalhes da geração de transações e determina se a transação é bem-sucedida (confirmada) ou falha (terminada). Para declarar uma página como transacional, adicione a diretiva @TRANSACTION no topo da página:
<%@ TRANSAÇÃO = valor %>
O parâmetro value pode ser um dos seguintes:
valor significado
Requires_New inicia uma nova transação.
Obrigatório inicia uma nova transação.
Suportado não inicia uma transação.
Not_Supported Não inicia a transação.
A diretiva @TRANSACTION deve estar na primeira linha de uma página, caso contrário será gerado um erro. Esta diretiva deve ser adicionada a cada página que precisa ser executada em uma transação. Quando o processamento do script termina, a transação atual termina.
A maioria dos aplicativos requer um ambiente de transação apenas para determinadas operações. Por exemplo, o site de uma companhia aérea pode exigir apenas scripts transacionais para lidar com emissão de bilhetes e organização de assentos, enquanto todos os outros scripts podem ser executados com segurança sem um ambiente transacional. Como as transações só precisam ser usadas para páginas que exigem processamento de transações, não declare o arquivo Global.asa do seu aplicativo como transacional.
Se uma transação for anulada, o Transaction Server reverterá quaisquer alterações nos recursos suportados por transação. Atualmente, apenas os servidores de banco de dados suportam totalmente as transações porque os dados no banco de dados são mais críticos para aplicativos corporativos. O Transaction Server não restaura alterações em arquivos, variáveis de sessão e de aplicativo, coleções, etc. no disco rígido. No entanto, é possível criar scripts de restauração de variáveis e coleções gravando eventos de transação, conforme descrito no tópico a seguir. Em determinados momentos, seu script também pode confirmar ou encerrar explicitamente uma transação, como quando a gravação de dados em um arquivo falha.
Confirmar ou encerrar scripts Como o Transaction Server acompanha o processamento da transação, ele determina se a transação foi totalmente bem-sucedida ou falhou. Um script pode encerrar explicitamente uma transação chamando ObjectContext.SetAbort. Por exemplo, um script precisa encerrar uma transação quando recebe uma mensagem de erro de um componente, viola especificações de negócios (por exemplo, o saldo de uma conta é menor que 0) ou falha em operações não transacionais, como leitura e gravação de arquivos. Se a página expirar antes que a transação seja concluída, a transação também deverá ser encerrada.
Escrever scripts de eventos de transação por si só não determina se uma transação será bem-sucedida ou falhará. No entanto, você pode gravar eventos que são chamados quando uma transação é confirmada ou encerrada. Por exemplo, se você tiver um script que confirma uma conta bancária e precisar retornar páginas diferentes ao usuário para diferentes estados da transação, poderá usar os eventos OnTransactionCommit e OnTransactionAbort para gravar respostas diferentes para o usuário.
<%@ TRANSACTION = Obrigatório %>
<%
'Buffer de saída para que diferentes páginas possam ser exibidas.
Resposta.Buffer = Verdadeiro
%>
<HTML>
<CORPO>
<H1>Bem-vindo ao serviço bancário on-line</H1>
<%
Definir BankAction = Server.CreateObject("MyExample.BankComponent")
BankAction.Deposit(Request("AcctNum"))
%>
<P>Obrigado. Sua transação está sendo processada.</P>
</BODY>
</HTML>
<%
'Exibe esta página se a transação for bem sucedida.
SubOnTransactionCommit()
Resposta.Escreva "<HTML>"
Resposta.Escreva "<BODY>"
Response.Write "Obrigado. Sua conta foi creditada."
Resposta.Escreva "</BODY>"
Resposta.Escreva "</HTML>"
Resposta.Flush()
final sub
%>
<%
'Exibe esta página se a transação falhar.
SubOnTransactionAbort()
Resposta.Clear()
Resposta.Escreva "<HTML>"
Resposta.Escreva "<BODY>"
Response.Write "Não foi possível concluir sua transação."
Resposta.Escreva "</BODY>"
Resposta.Escreva "</HTML>"
Resposta.Flush()
Terminar sub
%>
Registrando um componente no MTS Resource Manager Para participar de uma transação, o componente deve ser registrado no pacote MTS e configurado para exigir transações. Por exemplo, se o seu script manipula pedidos chamando dois componentes, um atualiza o banco de dados de inventário e o outro atualiza o banco de dados de pagamentos. Então, esses dois componentes devem ser executados no mesmo ambiente de transação. O Transaction Server garante que se algum componente falhar, nenhum banco de dados será atualizado. Alguns componentes não exigem transações; por exemplo, o componente Ad Rotator.
Registre e configure componentes transacionais usando o MTS Resource Manager. As propriedades da transação devem ser definidas como Exigir Transação ou Exigir Nova Transação. Os componentes da transação devem ser registrados no pacote MTS. Em vez de colocar componentes em pacotes em processo do IIS, crie seus próprios pacotes. Normalmente, todos os componentes devem ser colocados em uma biblioteca de componentes. Os componentes da biblioteca de componentes podem ser usados por vários aplicativos ASP e executados no processo de aplicativo ASP. Use o MTS Explorer para criar um novo pacote e definir a propriedade Ativação do pacote como Biblioteca.
Componentes transacionais também podem ser registrados no pacote Servidor. Os pacotes de servidor geralmente são executados como um processo separado no servidor. Se você quiser usar a verificação de segurança baseada em grupo funcional ou se quiser que seus componentes sejam acessíveis a aplicativos em computadores remotos, use o pacote Servidor para componentes transacionais.
Para usar o MTS Explorer, o Microsoft Transaction Server deve estar instalado.
Escopo do objeto Em geral, não armazene objetos criados a partir de componentes MTS em objetos Aplicativo ASP ou Sessão. Os objetos MTS desaparecem após a conclusão da transação. Como o objeto Session e o objeto Application são projetados para instâncias de objetos usadas entre diferentes páginas ASP, não os utilize para armazenar objetos liberados no final de uma transação.
O script ASP é a raiz da transação declarada, o ponto de partida. Qualquer objeto MTS usado por uma página ASP transacional é considerado parte da transação. Quando a transação for concluída, os objetos MTS usados na página desaparecerão, incluindo os objetos armazenados no objeto Sessão ou Aplicativo. Após esse ponto, qualquer tentativa de chamar um objeto com escopo de sessão ou de aplicativo de outra página transacional falhará.
Enfileiramento de transações As atualizações em um banco de dados a partir de um servidor remoto podem fazer com que as transações sejam atrasadas ou encerradas devido a atrasos ou falhas na rede. Como todas as partes da transação devem ser confirmadas, o aplicativo pode travar, aguardando uma mensagem de confirmação ou anulação do servidor remoto, ou a transação pode ser abortada porque as atualizações do banco de dados não podem ser enviadas.
Para atualizações que devem ser concluídas simultaneamente, a abordagem correta é encerrar a transação ou atrasar a conclusão da transação até que todos os participantes da transação possam se comprometer. Por exemplo, o processo de reserva de uma companhia aérea deve simultaneamente debitar a conta bancária do cliente e creditar a conta bancária da companhia aérea. Se uma atualização fizer parte de uma transação geral, mas puder ser posterior a outras atualizações, talvez você não queira fazer o cliente esperar que todo o processo de atualização seja concluído. Por exemplo, uma transação de reserva de voo também pode enviar um pedido de comida a um fornecedor de alimentos ou atualizar o subsídio de viagem de um cliente. Embora essas operações devam ser concluídas, elas podem ser feitas posteriormente.
O Microsoft Message Queue Server permite agrupar uma atualização ou um conjunto de atualizações em uma mensagem transacional para um servidor remoto. O Message Queue Server garante que as atualizações serão enviadas ao servidor remoto mesmo se a rede estiver indisponível no momento. Seu aplicativo receberá uma mensagem de commit e poderá continuar processando a transação.