Consultar datos antes de una transacción de confirmación

10

Entiendo que, en una ventana de MS SQL Server Management Studio, después de hacer una "transacción de inicio" y luego hacer algunos cambios como agregar datos a una tabla, solo puede consultar esa tabla y esos cambios desde la misma ventana hasta que realice un "transacción de compromiso".

¿Hay alguna forma de hacer una consulta desde otra fuente antes de hacer la "transacción de confirmación"?

Específico para mi objetivo actual y para agregar algo de contexto. Hago algunas consultas SQL desde Excel Power Query. Realmente me gustaría poder hacer estas consultas antes de la "transacción de compromiso" para poder hacer un análisis y averiguar si debería hacer una reversión en lugar de un compromiso.

Alex
fuente

Respuestas:

14

Sí, es posible si cambia el nivel de aislamiento de transacción para la sesión (eso es lo que llama "ventana" en SSMS) que consulta los datos modificados. A menudo, esta no es una gran idea, ya que puede obtener algunos resultados inesperados . Considere los efectos secundarios con cuidado. No tengo idea si es posible cambiar el nivel de aislamiento de la transacción en Excel Power Query.

Por ejemplo, el siguiente conjunto de consultas insertaría algunos datos y mostraría la actualización correctamente incluso sin confirmación / reversión.

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

Mientras tanto, la segunda sesión ejecuta una selección que no parece hacer nada:

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

Cree una tercera sesión y modifique su nivel de aislamiento:

-- Session 3
set transaction isolation level read uncommitted;
-- This reads the inserted data from the 1st session, even before commit
select * from Test;
vonPryz
fuente
¡Todo esto tiene sentido! Necesito probarlo y luego lo marcaré como respuesta. Gracias.
Alex
3

Como cuestión de mejores prácticas, las transacciones deben mantenerse lo más cortas posible y nunca esperar la interacción del usuario ; Cada vez que realiza algún tipo de modificación de datos o esquema dentro de una transacción, esto coloca bloqueos en los objetos o filas que se han tocado / modificado, lo que mantiene las consultas de otros usuarios en espera. Este turno puede crear efectos en cadena que pueden detener su servidor de base de datos.

En el escenario que está describiendo, le recomendaría que haga una copia de los datos para separar las tablas de "qué pasaría si" donde puede hacer sus modificaciones y revisar los resultados. Una vez que esté satisfecho con los resultados, use una transacción para fusionar los datos de esta tabla nuevamente en la (s) tabla (s) original (es).

Daniel Hutmacher
fuente
Suena como un buen consejo. La respuesta de @vonPryz fue solo lo que necesitaba en este momento. Creo que su sugerencia debería ser algo que vea a continuación.
Alex