[firebase-br] Commit
Osmar Cardoso Lopes
olopes em ici.curitiba.org.br
Sex Out 1 07:20:22 -03 2004
Oi Pessoal, estou começando a trabalhar com Firebird, portanto não conheço
muito. Atualmente trabalho com Sybase.Mas lendo o 'Release Notes' da versão
1.5 vi o texto abaixo. Pergunto: eu não posso implementar isto dentro de uma
SP ?
(1.5) "SAVEPOINTs" compatíveis com SQL99
Nickolay Samofatov
SAVEPOINTs definidos pelo usuário (também conhecidos como "nested
transactions") disponibilizam um
método conveniente para tratar erros de lógica sem a necessidade de fazer um
rollback da transação
como um todo. Disponível apenas em DSQL.
Utilize uma declaração SAVEPOINT para identificar um ponto de transação, ao
qual será possível
retornar através de um "Rollback" parcial.
SAVEPOINT <identificador>;
<identificador> especifica o nome do SAVEPOINT que será estabelecido. Depois
de criado um SAVEPOINT
você pode continuar o processamento, executar um commit ou um rollback de
toda a transação, ou
ainda um rollback até o SAVEPOINT.
Os nomes dos SAVEPOINT devem que ser únicos no contexto de uma transação. Se
um segundo
SAVEPOINT for estabelecido com o mesmo identificador, o primeiro será
sobreposto.
ROLLBACK [WORK] TO [SAVEPOINT] <identificador>;
Esta declaração executa as seguintes operações:
- Rollback das alterações executadas na transação após o SAVEPOINT
- Destrói todos os SAVEPOINTs criados após este SAVEPOINT. Este SAVEPOINT é
mantido, para que
você possa fazer um rollback para o mesmo SAVEPOINT múltiplas vezes. Os
SAVEPOINTs anteriores
a este também serão mantidos.
- Libera todos os locks obtidos implícita e explicitamente após o SAVEPOINT.
Outras transações que
tenham requerido acesso a linhas que estavam protegidas pelas alterações
efetuadas após a
criação do SAVEPOINT terão que continuar aguardando que a transação termine,
por commit ou
rollback. Outras transações, que não tivessem requerido ainda estas linhas,
poderão requerer e
acessa-las imediatamente.
Nota: este comportamento pode ser alterado em futuras versões.
O "undo log" do SAVEPOINT pode consumir uma grande quantidade de memória do
servidor,
principalmente se forem feitas modificações sobre os mesmos registros
múltiplas vezes na mesma
transação. Utilize a declaração RELEASE SAVEPOINT para liberar os recursos
consumidos para a
manutenção do SAVEPOINT.
RELEASE SAVEPOINT <identificador> [ONLY];
A declaração RELEASE SAVEPOINT destrói o SAVEPOINT <identificador> do
contexto da transação. A
menos que especifique ONLY, todos os SAVEPOINTs criados desde o SAVEPOINT
<identificador> serão
também destruídos.
Exemplos de utilização de SAVEPOINTs
create table test (id integer);
commit;
insert into test values (1);
commit;
insert into test values (2);
SAVEPOINT y;
delete from test;
select * from test; -- não devolve nenhuma linha
rollback to y;
select * from test; -- devolve duas linhas
rollback;
select * from test; -- devolve uma linha
SAVEPOINTs internos
Por padrão, o Servidor estabelece um SAVEPOINT de sistema automático para
cada transação para
possibilitar o seu ROLLBACK. Quando se executa um ROLLBACK, todas as
alterações efetuadas na
transação são desfeitas utilizando-se este SAVEPOINT de transação, e
posteriormente é efetuado o
COMMIT da mesma. Esta lógica permite reduzir a quantidade de "garbage
collection" originada por
transações "rolled back".
Quando o volume de dados alterados a partir do SAVEPOINT de uma transação é
demasiado grande
(10^4-10^6 registros afetados) o Servidor libera o SAVEPOINT da transação, e
utiliza o mecanismo TIP
para, se necessário, executar um RollBack da transação. Se for prevista uma
grande quantidade de
alterações dentro de uma transação, pode se utilizar o TPB flag
isc_tpb_no_auto para desabilitar o
SAVEPOINT automático de transação.
SAVEPOINTs e PSQL
Implementar SAVEPOINTs definidos pelo usuário em PSQL altera as regras de
atomicidade para as
declarações, incluindo as declarações de chamadas a procedures. O Firebird
disponibiliza o tratamento
de exceções em PSQL para reverter alterações efetuadas em Stored Procedures
e Triggers. Cada
declaração SQL/PSQL executada é assegurada por um SAVEPOINT interno
automático, onde ou toda a
declaração é executada com sucesso, ou TODAS as alterações efetuadas por ela
são "rolled back" e
uma exceção ocorre. Cada bloco de tratamento de exceções PSQL está também
incluído em um sistema
automático de SAVEPOINT.
----- Original Message -----
From: "Rubem Rocha" <rrocha em fpf.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Friday, October 01, 2004 9:55 AM
Subject: RES: [firebase-br] Commit
Não existe controle explícito de transação em SPs no FireBird. Quem tem que
fazer isso é a aplicação.
[]s
-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Alfredo
Enviada em: sexta-feira, 1 de outubro de 2004 08:47
Para: FireBase
Assunto: [firebase-br] Commit
Amigos,
Como faço para dar um "commit" dentro de uma stored procedure?
Acrescentei a linha "commit;" após um insert mas está dando erro ao
compilar.
Obrigado
Alfredo
______________________________________________
FireBase-BR (www.firebase.com.br)
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
______________________________________________
FireBase-BR (www.firebase.com.br)
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Esta mensagem pode conter informações confidenciais e/ou privilegiadas.
Se você não for o destinatário ou a pessoa autorizada a recebê-la, não pode
usar, copiar ou divulgar as informações nela contidas ou tomar qualquer ação
baseada nelas. Se você recebeu esta mensagem por engano, por favor, avise
imediatamente o remetente, e em seguida, apague-a.
Mais detalhes sobre a lista de discussão lista