[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