Consultar dados antes de uma transação de confirmação

10

Meu entendimento é que, em uma janela do MS SQL Server Management Studio, depois de fazer uma "transação inicial" e fazer algumas alterações, como adicionar dados a uma tabela, você só pode consultar essa tabela e essas alterações na mesma janela até fazer uma "confirmar transação".

Existe alguma maneira de fazer uma consulta de outra fonte antes de fazer a "transação de confirmação"?

Específico ao meu objetivo atual e para adicionar algum contexto. Eu faço algumas consultas SQL do Excel Power Query. Eu realmente gostaria de poder fazer essas consultas antes da "transação de confirmação", para que eu possa fazer alguma análise e descobrir se eu deveria fazer uma reversão em vez de uma confirmação.

Alex
fonte

Respostas:

14

Sim, é possível se você alterar o nível de isolamento da transação da sessão (é o que chama de "janela" no SSMS) que consulta dados modificados. Geralmente, essa não é uma ótima idéia, pois você pode obter resultados inesperados . Considere os efeitos colaterais com cuidado. Não faço ideia se é possível alterar o nível de isolamento da transação no Excel Power Query.

Por exemplo, o seguinte conjunto de consultas inseria alguns dados e exibia a atualização corretamente, mesmo sem confirmação / reversão.

-- Session 1
begin tran tx_test;
-- Assume the Test table exists and insert is okay
insert dbo.Test(datadate, content) values (getdate(), 'transaction');
select * from Test; -- Shows the new data
-- After select, one would execute one of the following
-- commit;
-- rollback;

Enquanto isso, a segunda sessão executa uma seleção que parece não fazer nada:

-- Session 2
-- This waits for uncommitted transaction
-- and returns results after 1st session commits/rollbacks
select * from Test;

Crie uma terceira sessão e altere seu nível de isolamento:

-- Session 3
set transaction isolation level read uncommitted;
-- This reads the inserted data from the 1st session, even before commit
select * from Test;
vonPryz
fonte
Tudo isso faz sentido! Preciso experimentá-lo e marcá-lo como resposta. Obrigado.
Alex
3

Por uma questão de boas práticas, as transações devem ser mantidas o mais curtas possível e nunca esperar pela interação do usuário ; toda vez que você executa algum tipo de modificação de dados ou esquema em uma transação, isso coloca bloqueios nos objetos ou linhas que foram tocados / modificados, o que mantém as consultas de outros usuários aguardando. Por sua vez, pode criar efeitos de cadeia que podem levar o servidor de banco de dados a parar.

No cenário que você está descrevendo, recomendo que você faça uma cópia dos dados para separar as tabelas "what-if" nas quais você pode fazer suas modificações e revisar os resultados. Quando estiver satisfeito com os resultados, use uma transação para mesclar os dados desta tabela novamente nas tabelas originais.

Daniel Hutmacher
fonte
Parece um bom conselho. A resposta de @vonPryz foi apenas o que eu precisava no momento. Eu acho que sua sugestão deve ser algo que considerarei a seguir.
Alex