Eu quero impedir a simultaneidade na minha tabela para Excluir, Inserir, Atualizar e Selecionar, então tentei usar SERIALIZABLE
a tabela antes da transação, mas isso não bloqueou a tabela para outros processos! como corrigi-lo ?
O que eu tentei:
1- Criar Tabela_1
--Create Sample Table
CREATE TABLE [dbo].[Table_1](
[Number] [bigint] NOT NULL,
[Price] [bigint] NULL,
CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED
(
[Number] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT [dbo].[Table_1] ([Number], [Price]) VALUES (1, 1000)
GO
INSERT [dbo].[Table_1] ([Number], [Price]) VALUES (2, 3000)
GO
INSERT [dbo].[Table_1] ([Number], [Price]) VALUES (3, 8000)
GO
2- Consulta da Sessão um com atraso:
--SESSION 1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
WAITFOR DELAY '00:00:10.000'
UPDATE Table_1 SET Price = 6000 WHERE NUMBER = 1
SELECT * FROM Table_1
COMMIT TRANSACTION;
3- Consulta para a sessão dois, e esta consulta mais espera pela sessão um até o final do processo, mas não é! :
--SESSION 2
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT * FROM Table_1
COMMIT TRANSACTION;
Seu atraso está no lugar errado.
Você está esperando por dez segundos na transação 1 antes de fazer qualquer alteração.
A transação 2 não tem motivo para esperar antes que a transação 2 faça qualquer alteração.
Coloque o atraso após a atualização e você verá o bloqueio.
O nível de isolamento serializável garante um resultado igual como se as transações tivessem sido executadas sequencialmente, em alguma ordem. Ele não exige que as transações realmente se comportem dessa maneira.
Se você quiser evitar toda a simultaneidade, use um bloqueio de tabela exclusivo. Consulte o bloqueio Sch-M de solicitação de perguntas e respostas relacionado em uma tabela para obter detalhes.