Avançar para a área de conteúdo

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Todas as informações enviadas são seguras.

  • Fechar [x]

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Todas as informações enviadas são seguras.

  • Fechar [x]

DB2 9.7: Transações autônomas

O que são, como criá-las e exemplos do mundo real

Yash Manwani, Associate Software Engineer, IBM  
Photo of Yash Manwani
Yash D. Manwani é Associate Software Engineer da IBM India. Trabalha na IBM desde 2008. Desde que ingressou na empresa, ele faz parte da equipe de teste de verificação funcional do DB2 ISL e todo esse tempo ele trabalhou em garantia de qualidade do DB2. Yash é bacharel em engenharia eletroeletrônica e de comunicações pela Universidade de Ciência e Tecnologia de Cochim, na Índia.
Mike Springgay, Senior Development Manager, IBM  
Photo of Mike Springgay
Mike Springgay é Senior Development Manager da equipe de desenvolvimento do DB2 para Linux, UNIX e Windows. Ele passou a fazer parte da equipe de desenvolvimento do DB2 em 1997 e atualmente é responsável pelas áreas de conectividade cliente/servidor e de infraestrutura de procedimentos armazenados.

Resumo:  Conheça as transações autônomas, um recurso apresentado no IBM DB2® versão 9.7 para Linux®, UNIX® e Windows®. Teremos uma visão geral e um exemplo do que é uma transação autônoma e de como criá-la.

Visualizar mais conteúdo nesta série

Data:  06/Fev/2012
Nível:  Introdutório
Atividade:  231 visualizações
Comentários:  


Introdução

Este artigo apresenta as transações autônomas, um recurso apresentado no DB2 9.7. As transações autônomas são de interesse para administradores de banco de dados e desenvolvedores de aplicativos.

Este artigo trata do DB2 9.7 para Linux, UNIX e Windows. É bom ter conhecimento sobre o processador da linha de comando (CLP) do DB2 e SQL PL.

Para executar os exemplos, é preciso acessar um banco de dados do DB2 9.7 para Linux, UNIX e Windows. Consulte Recursos para fazer o download de uma cópia de avaliação do DB2.


Descrição básica das transações

As transações são entidades do mundo real que podem ser expressas na forma de texto, números, ou ambos, para serem processadas por um sistema de gerenciamento de banco de dados. São consideradas ações com relação ao banco de dados, e devem ser executadas em grupo.

Por exemplo, uma solicitação para transferir uma quantia X da conta do usuário A para a conta do usuário B é uma transação simples. Essa transação pode ser dividida em duas instruções SQL, como mostra a Listagem 1.


Listagem 1. Exemplo de transação simples

Update table AccountInfo set CurrentBalance = CurrentBalance - X, where UserName=A 
Update table AccountInfo set CurrentBalance = CurrentBalance + X, where UserName=B 
    

Essa transação só pode ser considerada bem-sucedida se ambas as instruções SQL conseguirem atualizar a tabela com sucesso. Para certificar-se de que as duas instruções entrem em vigor, ou nenhuma entre, os aplicativos são executados de modo que não sejam feitas mudanças no banco de dados até que ocorra COMMIT. Em um COMMIT, todas as instruções não confirmadas (instruções após o último COMMIT) entram em vigor juntas, assegurando a integridade de dados. Isso é similar a desligar o comportamento AUTO COMMIT do processador de linha de comandos (CLP), emitir um conjunto de instruções e depois dar um COMMIT manualmente ao terminar. Um ROLLBACK remove todas as mudanças não confirmadas. De modo que as instruções COMMIT e ROLLBACK são blocos de criação importantes de uma implementação de transação.


Apresentando uma transação autônoma

Uma transação autônoma tem seu próprio escopo de COMMIT e ROLLBACK para assegurar que seu resultado não afete as mudanças não confirmadas do responsável pela chamada. Além disso, os COMMITs e ROLLBACKs na sessão que chama não devem afetar as mudanças finalizadas na conclusão da própria transação autônoma.

Observe que a sessão que chama é suspensa até que a sessão chamada retorne o controle. O suporte a transações autônomas não deve ser encarado de forma alguma como suporte a sessões em execução paralela.


Criando uma transação autônoma

No DB2, as transações autônomas são implementadas por meio de procedimentos autônomos. Um procedimento armazenado fornece um meio natural de empacotar instruções em um bloco. Para criar um procedimento autônomo, a palavra-chave AUTONOMOUS é especificada na instrução CREATE PROCEDURE, como mostra a Listagem 2.


Listagem 2. Exemplo da instrução CREATE PROCEDURE
            
CREATE OR REPLACE your_procedure_name
LANGUAGE SQL
AUTONOMOUS
BEGIN    
	do autonomous work ;
END
    

Quando um procedimento autônomo é chamado, ele é executado dentro da própria sessão para fornecer a independência de transação necessária. Os procedimentos autônomos bem-sucedidos confirmam implicitamente, enquanto os que não são bem-sucedidos retrocedem. Seja como for, a transação que chama fica intacta.


Analisando um exemplo de uso da vida real

O Banco B quer se certificar de que cada consulta a uma tabela que contém dados confidenciais do cliente seja registrada adequadamente. Para atingir esse objetivo, os desenvolvedores de aplicativos do Banco B recebem um conjunto de interfaces que podem usar para acessar os dados confidenciais. Cada interface é implementada como procedimento armazenado. O procedimento armazenado retorna as informações necessárias da tabela e, ao mesmo tempo, registra o ID do usuário do funcionário que faz a consulta e o número da conta do registro do cliente consultado com a data e hora.

Suposições

O SQL supõe todos os seguintes:

  • Que existe conexão com o banco de dados
  • Que a confirmação automática está desligada
  • Que o terminador da instrução está configurado para % , o que é feito inserindo a instrução CLP do DB2 db2 +c -td% , iniciando uma nova sessão de CLP do DB2

Início

Primeiro, crie as tabelas necessárias. Será necessária uma tabela para conter as informações confidenciais do cliente e outra para conter as informações a serem registradas toda vez que informações confidenciais forem acessadas. A Listagem 3 mostra um exemplo.


Listagem 3. Criando duas tabelas de exemplo
            
DROP TABLE customerSensitiveInfo %
CREATE TABLE customerSensitiveInfo(customerAccountNumber integer, amountOverdue integer) %

DROP TABLE log_table %
CREATE TABLE
   log_table(queryingEmployeeID varchar(100), 
             customerAccNumber integer, when timestamp) %
COMMIT %
    

A seguir, crie um procedimento para gravar na log_table quando forem acessadas informações confidenciais, como mostra a Listagem 4.


Listagem 4. Gravando na tabela de logs
            
CREATE OR REPLACE PROCEDURE
   log_query (in queryingEmployee varchar(100), 
              in accNumber integer, in when timestamp)
LANGUAGE SQL
BEGIN
   insert into log_table values (queryingEmployee, accNumber, when);
END %
COMMIT %
    

Uma das interfaces que o Banco B fornece aos seus desenvolvedores de aplicativos é um meio de consultar quanto determinada conta está atrasada. O procedimento get_AmountOverdue primeiro faz uma chamada para o procedimento log_query a fim de registrar que acessará dados confidenciais. Depois, faz uma seleção da tabela customerSensitiveInfo para recuperar a quantia atrasada em determinado número da conta. A Listagem 5 mostra um exemplo.


Listagem 5. Procedimento get_AmountOverdue
            
CREATE OR REPLACE PROCEDURE
   get_AmountOverdue(in accountNumber integer, out overdue integer)
LANGUAGE SQL
BEGIN
   DECLARE due integer;	
   DECLARE currentTime timestamp;
	
   SET currentTime= CURRENT TIMESTAMP;
	
   CALL log_query(CURRENT USER, accountNumber, currentTime );
	
   SELECT amountOverdue INTO due FROM customerSensitiveInfo 
                         WHERE customerAccountNumber= accountNumber;
									  	 
   SET overdue=due;
END %

COMMIT %
     

Após criar a interface get_AmountOverdue, inclua alguns dados do cliente na tabela customerSensitiveInfo. A seguir, execute a instrução na Listagem 6 para criar a tabela.


Listagem 6. Instrução para criar uma tabela de exemplo
            
INSERT INTO customerSensitiveInfo VALUES(12345, 10000),(12346,20000) %
COMMIT %
     

A tabela resultante contém as informações mostradas na Tabela 1.


Tabela 1. CustomerSensitiveInfo
CustomerAccountNumberAmountOverdue
1234510,000
1234620,000

Com a tabela agora preenchida com dados e um meio de acessá-la, recupere a quantia atrasada da conta 12345. Visto que estamos interessados apenas em visualizar os dados, preferimos fazê-lo de forma anônima. Assim, emita uma instrução de retrocesso imediatamente após a chamada para cobrir seus rastros, como mostra a Listagem 7.


Listagem 7. Inclua uma instrução de retrocesso no código de get_AmountOverdue
            
CALL get_AmountOverdue(12345, ?) %
        
Value of output parameters
--------------------------
Parameter Name  : OVERDUE
Parameter Value : 10,000
        
return Status = 0
        
ROLLBACK %
    

Verifique o estado da log_table, que é semelhante à Listagem 8.


Listagem 8. log_table
            
SELECT * FROM log_table %
        
QUERYINGEMPLOYEEID     CUSTOMERACCNUMBER       WHEN
        
0 record(s) selected.
    

Como esperado, a tabela de logs está vazia porque a transação que contém o acesso real à tabela e a inserção na tabela de logs passou por retrocesso. Definitivamente, esse não é o comportamento desejado. Inclua a palavra-chave AUTONOMOUS no procedimento log_query, como mostra a Listagem 9.


Listagem 9. Procedimento log_query com a instrução AUTONOMOUS
            
CREATE OR REPLACE PROCEDURE 
   log_query (in queryingEmployee varchar(100), 
              in accNumber integer, in when timestamp)
LANGUAGE SQL
AUTONOMOUS
BEGIN
   INSERT INTO log_table values (queryingEmployee, accNumber, when);
END %

COMMIT %
    

Agora recupere a quantia atrasada da conta 12345, e retroceda novamente a transação após fazer isso, como mostra a Listagem 10.


Listagem 10. Código get_AmountOverdue com a instrução de retrocesso
            
CALL get_AmountOverdue(12345, ?) %
        
Value of output parameters
--------------------------
Parameter Name  : OVERDUE
Parameter Value : 10,000
        
return Status = 0
        
ROLLBACK %
    

Verifique novamente o estado de log_table, que agora está parecida à Listagem 11.


Listagem 11. log_table após a inclusão da instrução AUTONOMOUS
            
SELECT * FROM log_table %
			 	
QUERYINGEMPLOYEEID     CUSTOMERACCNUMBER       WHEN
98765                  12345                   2009:05:25:12.00.00.000000
			 	
1 record(s) selected.
    

Desta vez, obtém-se o resultado desejado. Embora a mesma transação que leu as informações confidenciais tenha passado por retrocesso, as entradas da log_table foram confirmadas. Dessa forma, pode-se manter um histórico de quem tem acesso aos dados, mesmo que o acesso em si não tenha sido confirmado.


Conclusão

Este artigo apresentou o conceito de transações autônomas. Agora, entendemos o que é uma transação autônoma e como criar e usar uma no DB2.


Recursos

Aprender

Obter produtos e tecnologias

Discutir

Sobre os autores

Photo of Yash Manwani

Yash D. Manwani é Associate Software Engineer da IBM India. Trabalha na IBM desde 2008. Desde que ingressou na empresa, ele faz parte da equipe de teste de verificação funcional do DB2 ISL e todo esse tempo ele trabalhou em garantia de qualidade do DB2. Yash é bacharel em engenharia eletroeletrônica e de comunicações pela Universidade de Ciência e Tecnologia de Cochim, na Índia.

Photo of Mike Springgay

Mike Springgay é Senior Development Manager da equipe de desenvolvimento do DB2 para Linux, UNIX e Windows. Ele passou a fazer parte da equipe de desenvolvimento do DB2 em 1997 e atualmente é responsável pelas áreas de conectividade cliente/servidor e de infraestrutura de procedimentos armazenados.

Ajuda para Relatar Abuso

Relatar abuso

Obrigado. Esta entrada foi sinalizada para atenção do moderador.


Ajuda para Relatar Abuso

Relatar abuso

Falha no envio do Relatório de abuso. Tente novamente mais tarde.


developerWorks: Registre-se


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Selecione seu nome de exibição

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

(Deve possuir de 3 a 31 caracteres.)


Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Classificar este artigo

Comentários

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Information Management
ArticleID=789923
ArticleTitle=DB2 9.7: Transações autônomas
publish-date=02062012

Conheça a IBM da sua cidade

Virtual Branch Office Brasil

A IBM está mais perto do que você imagina!


Tags

Help
Use o campo de pesquisa para encontrar todos os tipos de conteúdo no My developerWorks com essa tag.

Use a barra de rolagem para ver mais ou menos tags.

Tags populares mostra as principais tags para esta zona de conteúdo em particular (por exemplo, Java technology, Linux, WebSphere).

Minhas tags mostra suas tags para esta zona de conteúdo em particular (por exemplo, Java technology, Linux, WebSphere).

Use o campo de pesquisa para localizar todos os tipos de conteúdo no Meu developerWorks com essa tag. Tags populares mostra as tags principais para essa zona de conteúdo particular (por exemplo, tecnologia Java, Linux, WebSphere). My tags shows your tags for this particular content zone (for example, Java technology, Linux, WebSphere). Minhas tags mostra as suas tags para essa zona de conteúdo em particular (por exemplo, tecnologia Java, Linux, WebSphere).