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
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.
Sendo assim, se realizarmos um ROLLBACK TRANSACTION nessa sessão nenhuma estrutura terá sido criada.
Como foi executado um ROLLBACK na transação, não encontramos a estrutura.
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
USE WorkSpace
CREATE TABLE DadosEmpregados
Nome VARCHAR(50) NOT NULL,
DataNascimento DATE NULL
ALTER TABLE DadosEmpregados
ADD CONSTRAINT PK_DadosEmpregados_ID
PRIMARY KEY (ID)
Nesse momento irei abrir uma transação e utilizar o recurso SAVE TRANSACTION
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)
No Log da base de dados, foi marcado um CheckPoint, temos uma marca dentro do LSN.
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′)
SAVE TRANSACTION DadosEmpregadosSecondInsert
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
Nesse momento, se visualizarmos a tabela teremos os 100 registos que foram inseridos na primeira massa de dados, referente ao SAVE TRANSACTION DadosEmpregadosFirstInsert
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.
Luciano Lima [MVP] Brazil edited Revision 3. Comment: Alterado o título e adicionado novas tags.
Fernando Lugão Veltem edited Revision 1. Comment: Adicionado TOC
Luan.Moreno - SQL Soul edited Original. Comment: Alterações Código T-SQL