quarta-feira, 7 de julho de 2010

Criando savepoints com o comando SAVE TRANSACTION

O comando SAVE TRANSACTION permite criar savepoints dentro de uma transação. Estes “marcadores” permitem recuperar alterações dentro de uma transação para o ponto onde o savepoint foi criado, porém o savepoint precisa de comandos SQL subseqüentes e de comandos ROLLBACK ou COMMIT para seu cancelamento ou consolidação.
Observe o seguinte exemplo:
CREATE TABLE TELEFONE(
  CODIGO INT,
  DDD NVARCHAR(3),
  TELEFONE NVARCHAR(15)
)

BEGIN TRAN

      SAVE TRANSACTION PRIMEIRO   
      INSERT INTO TELEFONE VALUES (1,'11','123456')
     

      BEGIN TRAN
            SAVE TRANSACTION SEGUNDO

            UPDATE TELEFONE SET TELEFONE='-1'
            WHERE CODIGO=1
            AND TELEFONE='123456' 
Veja que os savepoints são criados antes dos comando DML, demarcando o momento do banco de dados para onde podemos voltar. Agora, execute o seguinte comando:
SELECT * FROM TELEFONE
WHERE CODIGO=1
O resultado deve ser uma linha com o código igual a 1, ddd igual a 11 e o telefone igual a -1. Agora execute os seguintes comandos:
ROLLBACK TRANSACTION SEGUNDO
SELECT * FROM TELEFONE
WHERE CODIGO=1
Observe que o resultado é novamente uma linha, porem com o número 123456, inserido no comando anterior. Agora faça um select na função @@TRANCOUNT , (SELECT @@TRANCOUNT)  e veja que temos duas transações ativas. O comando ROLLBACK TRANSACTION <SAVEPOINT> apenas recupera o ponto marcado, porém não finaliza transações. Para finalizar as transações abertas, temos que usar o COMMIT ou ROLLBACK, sem referência ao nome do savepoint.
Se executarmos o comando COMMIT duas vezes neste ponto do exemplo, o resultado será a consolidação do registro com CODIGO igual 1, DDD igual a 11 e TELEFONE igual a 123456.
Até a próxima!

Nenhum comentário:

Postar um comentário

Leave your comment here!