Obtenga transacciones que fallaron o que nunca se comprometieron

Respuestas:

5

No, SQL Server no mantiene ningún historial sobre las transacciones que fueron canceladas / revertidas que es trivial y no presenta problemas potenciales adicionales (como se describe en la respuesta de @ ooutwire ). O incluso transacciones que se han comprometido.

Tendrá que realizar su propio registro dentro de su manejo de errores, o capturar eventos específicos relacionados con transacciones usando el rastreo del lado del servidor o Eventos extendidos.

Rastro:

ingrese la descripción de la imagen aquí

Eventos extendidos:

ingrese la descripción de la imagen aquí

Aaron Bertrand
fuente
Claro que sí, están en el archivo de registro y los archivos de respaldo de registro.
Ooutwire
1
@ooutwire y ¿cómo llegar a ellos fácilmente? ¿Y cómo llegar a ellos si ya no están en el registro? Esos registros son transitorios en el mejor de los casos.
Aaron Bertrand
Mira mi respuesta. La mejor manera es crear copias de seguridad de registros frecuentes. Estoy de acuerdo en que tal solución no es ideal; pero no veo ninguna razón por la que estaría buscando todo el tiempo en busca de transacciones abortadas. Si ese es el deseo, entonces un rastro o XEvent parecería la solución prudente.
ooutwire
2
Vi tu respuesta, por supuesto. Dije fácilmente y también debería haberlo dicho de manera confiable . :-)
Aaron Bertrand
66
Estoy con @AaronBertrand en este caso. Con el problema que tomará revisar los registros de transacciones ( Nota: no es para lo que están destinados ), también podría crear una sesión XE liviana para esta solución de problemas.
Thomas Stringer
4

Cuando dice transacciones "fallidas", ¿qué quiere decir exactamente?

Si desea ver las transacciones actuales en la instancia, puede utilizar el sys.dm_tran_active_transactionsDMV.

Además, sys.dm_exec_sessionstiene el open_transaction_countque puede darle esta información por sesión. A continuación se muestra una consulta de diagnóstico para extraer todos los procesos de usuario que tienen transacciones abiertas:

select 
    s.session_id,
    s.login_name,
    s.open_transaction_count,
    st.text as most_recent_sql_text
from sys.dm_exec_sessions s
inner join sys.dm_exec_connections c
on s.session_id = c.session_id
outer apply sys.dm_exec_sql_text(c.most_recent_sql_handle) st
where s.is_user_process = 1
and s.open_transaction_count > 0;

Esta información también se puede obtener de sys.dm_tran_session_transactions:

select
    session_id,
    is_user_transaction,
    open_transaction_count
from sys.dm_tran_session_transactions;

Si desea capturar cuándo se retrotraeron las transacciones (suponiendo tanto su deseo de transacciones "fallidas"), puede capturar el rollback_tran_completedevento Eventos extendidos . Si está buscando una vista de "todo" de las transacciones, puede capturar el sql_transactionevento, que según lo definido por SQL Server es

Ocurre cuando una transacción de SQL Server comienza, completa, revierte o ejecuta un punto de rescate. Use este evento para monitorear el comportamiento de las transacciones al solucionar problemas de aplicaciones, disparadores o procedimientos almacenados.

Thomas Stringer
fuente
4

Puede usar fn_dblog () y buscar los ID de transacción para transacciones canceladas, así como una gran cantidad de otra información útil.

SELECCIONE * 
DE fn_dblog (NULL, NULL)
WHERE Operación = 'LOP_ABORT_XACT';
VAMOS

Escanea todo el registro de transacciones en la parte activa del registro. Esto se puede anular utilizando el indicador de traza 2537, que le permitirá volver lo más lejos posible al inicio del VLF "no reutilizado" más antiguo. Tenga cuidado al usar esta función, ya que escanea el registro al azar y el registro no puede cambiar cuando se realiza el escaneo; entonces, puede ver el crecimiento del registro.

También puede usar fn_dump_dblog contra un archivo de respaldo de registro.

fuera de línea
fuente