Gerenciamento de Transação

Posted on outubro 11, 2011

1


Quando desejamos gerenciar ou controlar transações dentro do SQL Server podemos utilizar transações implícitas, ou seja a cada transação que for realizada no SQL Server é necessário que seja especificado um COMMIT ou ROOLBACK  ou também utilizar O SAVE TRANSACTION, iremos ver a seguir os dois modos.

 

Transações Implícitas

 

SET IMPLICIT_TRANSACTIONS ON;

 

CREATE TABLE Tempdb.dbo.TesteTransaction

(

      ID INT IDENTITY(1,1) NOT NULL,

      Nome VARCHAR(50)

)

go

 

INSERT INTO Tempdb.dbo.TesteTransaction (Nome)

VALUES (‘Luan Moreno Medeiros Maciel’)

GO 100

 

SELECT *

FROM Tempdb.dbo.TesteTransaction

 

image

 

Ou seja a transação está em espera, tanto é que se visualizarmos em SP_LOCK teremos que a tabela está em LOCK por causa da transação que ainda não foi comitada.

 

image

 

Sendo assim,  se realizarmos um ROLLBACK TRANSACTION nessa sessão nenhuma estrutura terá sido criada.

 

image

 

image

 

Como foi executado um ROLLBACK na transação, não encontramos a estrutura.

 

Outra forma de conseguimos realizar o controle de uma transação é utilizando o SAVE TRANSACTION como dito anteriormente, que é um recurso pouco usado, porém bem interessante, por isso vamos analisar como ele funciona.

 

Save Transaction

 

E se você quisesse que dentro de uma transação fosse realizadas várias operações, e cada uma dessas operações fossem controladas, isso é possível ?

 

Sim, com esse recurso podemos fazer o controle dentro de uma transação, sendo assim vamos realizar a criação da estrutura para podermos utilizar esse recurso.

 

CREATE DATABASE WorkSpace

go

 

USE WorkSpace

go

 

 

CREATE TABLE DadosEmpregados

(

      ID INT IDENTITY(1,1) NOT NULL,

      Nome VARCHAR(50) NOT NULL,

      DataNascimento DATE NULL

)

go

ALTER TABLE DadosEmpregados

ADD CONSTRAINT PK_DadosEmpregados_ID

PRIMARY KEY (ID)

 

Nesse momento irei abrir uma transação e utilizar o recurso SAVE TRANSACTION

image

Conseguimos visualizar que, temos agora uma transação aberta e logo depois realizo o save desta transação.

Agora iremos ver o que o LOG da base de dados nós mostra, utilizando o DBCC LOG, vemos que..

 

DBCC Log(WorkSpace,3)

 

image

No Log da base de dados, foi marcado um CheckPoint, temos uma marca dentro do LSN.

 

image

 

image

 

Conseguimos ver o SPID ou seja a conexão que está realizando a transação, a data , ID da transação, nome do Savepoint sendo este o nome que foi colocado no SAVE TRANSACTION.

 

Tendo esse MARK no LSN a Engine do SQL Server/Storage Engine (Transaction Services)  será possível voltar a esse ponto dentro da transação, interessante não?

 

Nesse momento será realizado dois tipos de operações DML  o insert e o delete, sempre realizando um SAVE TRANSACTION antes das operações.

 

INSERT INTO DadosEmpregados (Nome, DataNascimento)

OUTPUT inserted.*

VALUES (‘Luan Moreno Medeiros Maciel’,‘1988-07-20’)

GO 100

 

SAVE TRANSACTION DadosEmpregadosSecondInsert

 

INSERT INTO DadosEmpregados (Nome, DataNascimento)

OUTPUT inserted.*

VALUES (‘Luan Moreno Medeiros Maciel’,‘1988-07-20’)

GO 10

 

SAVE TRANSACTION DadosEmpregadosFirtDelete

 

DELETE FROM DadosEmpregados

WHERE ID = 1

 

Depois das operações realizadas, eu irei realizar o ROLLBACK do segundo SAVE TRANSACTION

image

 

Nesse momento, se visualizarmos a tabela teremos os 100 registos que foram inseridos na primeira massa de dados, referente ao SAVE TRANSACTION DadosEmpregadosFirstInsert

 

image

 

 

Explicando……

 

1 Save Transaction = Antes das 100 inserções.

2 Save Transaction = Antes das 10 inserções

3 Save Transaction = Antes do Delete ID = 1

 

Sendo assim quando foi realizado o ROLLBACK TRANSACTION DadosEmpregadosSecondInsert a transação foi voltada ao momento das 100 primeiras inserções depois de serem realizadas. Logo depois podemos realizar o commit da transação.

 

image

 

 

 

Gostou? Deixe seu comentário….

Att.