Gerenciamento de Transações no SQL Server (pt-BR)

Introdução

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.

Entendendo os 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

 http://luanmorenodba.files.wordpress.com/2011/10/image_thumb6.png?w=224&h=244

 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.

 http://luanmorenodba.files.wordpress.com/2011/10/image_thumb7.png?w=493&h=179

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

 http://luanmorenodba.files.wordpress.com/2011/10/image_thumb8.png?w=168&h=28

http://luanmorenodba.files.wordpress.com/2011/10/image_thumb9.png?w=332&h=111

 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ê desejasse 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

http://luanmorenodba.files.wordpress.com/2011/10/image_thumb10.png?w=408&h=129

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)

 http://luanmorenodba.files.wordpress.com/2011/10/image_thumb11.png?w=767&h=144

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

 http://luanmorenodba.files.wordpress.com/2011/10/image_thumb12.png?w=699&h=134

 http://luanmorenodba.files.wordpress.com/2011/10/image_thumb13.png?w=244&h=175

 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

http://luanmorenodba.files.wordpress.com/2011/10/image_thumb14.png?w=409&h=54

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

 http://luanmorenodba.files.wordpress.com/2011/10/image_thumb15.png?w=316&h=227

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.

 http://luanmorenodba.files.wordpress.com/2011/10/image_thumb16.png?w=244&h=80

Visualizamos nesse momento que não temos transações abertas nessa sessão.