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

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



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

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


Visualizamos nesse momento que não temos transações abertas nessa sessão.
Leave a Comment
  • Please add 6 and 6 and type the answer here:
  • Post
Wiki - Revision Comment List(Revision Comment)
Sort by: Published Date | Most Recent | Most Useful
Comments
Page 1 of 1 (3 items)
Wikis - Comment List
Sort by: Published Date | Most Recent | Most Useful
Posting comments is temporarily disabled until 10:00am PST on Saturday, December 14th. Thank you for your patience.
Comments
  • Luan.Moreno - SQL Soul edited Original. Comment: Alterações Código T-SQL

  • Fernando Lugão Veltem edited Revision 1. Comment: Adicionado TOC

  • Luciano Lima [MVP] Brazil edited Revision 3. Comment: Alterado o título e adicionado novas tags.

Page 1 of 1 (3 items)