Cómo solucionar el problema de bloqueo de sesión en SqlServer
Introducción
Para el personal de operación y mantenimiento de bases de datos, es común que ocurran problemas al crear sesiones o consultas. A continuación se muestra una manera muy efectiva de resolver problemas similares sin recurrir a terceros. herramientas del partido.
Recientemente comencé a involucrarme en trabajos de operación y mantenimiento, así que resumí algunas soluciones para ayudar a los colegas que no entienden las bases de datos a resolver algunos problemas de bases de datos menos importantes. Hay muchos métodos y teorías similares, por lo que no los entraré en detalle. Simplemente escribiré una solución simple que sea fácil de usar para los principiantes.
Comprensión del bloqueo
En Sql Server, el bloqueo ocurre cuando una transacción en una sesión de base de datos bloquea uno o más recursos que otras transacciones de la sesión desean leer o modificar (Bloqueo). Generalmente, el bloqueo por períodos cortos de tiempo no es un problema y es necesario para aplicaciones más ocupadas. Sin embargo, las aplicaciones mal diseñadas pueden provocar largos períodos de bloqueo, bloqueando recursos innecesariamente e impidiendo que otras sesiones los lean y actualicen.
Ejemplo
Para una mejor explicación, se utiliza un ejemplo a continuación. Cree una tabla e inserte datos, luego cree diferentes sesiones mientras bloquea la sesión. Las capturas de pantalla del código específico son las siguientes:
1. Crear tabla Empleado
2. Insertar datos de prueba
Ahora tenemos una tabla de prueba con 12 datos. en él, abra otro cuadro de diálogo de consulta en SSMS (lo que significa que se vuelve a crear una sesión)
3. En la nueva ventana de consulta, primero abra una transacción y luego escriba una declaración de inserción
<. p >En este lugar podemos ver que se abre una transacción. Pero no hay una transcripción final para finalizar la transacción, por lo que el estado de la transacción es "abierto". Ahora ejecute el script para ver la sesión que se está ejecutando actualmente en el estado "abierto".Ahora puede ver que la consulta en ejecución está en estado abierto, como se muestra en la figura anterior. Ejecutamos este comando pero no lo completamos. El DBA se comunicará con el creador de esta sesión para completar la transacción o revertirla.
Ahora creemos otra sesión, actualicemos un registro sin enviarlo, es decir, dejemos que el estado de la sesión de consulta sea "abierto". Por lo tanto, escriba una declaración en una nueva ventana de consulta para ejecutar de la siguiente manera:
Aquí verá el estado de la declaración que no se ha completado después de que el sistema se esté ejecutando (porque la transacción anterior no se ha cerrado y resultó en un bloqueo de tabla, esto no se puede insertar), Ahora puede verificar la situación de bloqueo en otra ventana, de la siguiente manera para verificar la sesión bloqueada.
Como se muestra arriba, el ID de la sesión bloqueada es 58. Debido a que actualizamos la consulta, se bloqueó la ejecución de 54. 54 es el lote no confirmado de nuestros datos insertados.
Ahora que podemos descubrir la causa del bloqueo, podemos resolverlo con calma.
Solución
Opción 1
Si comprende el negocio, puede utilizar directamente la declaración de ID de finalización de sesión para finalizar una sesión bloqueada.
Opción 2
Agregue la instrucción "set lock_timeout 1000" al comienzo de la transacción ejecutada, lo que significa que si el bloqueo excede los 1000 milisegundos, la solicitud finalizará.
Opción 3
Revertir o confirmar la transacción. No entraré en detalles sobre esto.
El siguiente es el código para todas las declaraciones:
/****Creando tabla ficticia Empleado ****/
CREATE TABLE Empleado ( Empid int NOT NULL , Nombre nchar(10) NULL, Ciudad nchar(10) NULL ) ON [PRIMARY] GO
/**** Insertar datos ficticios en la tabla de empleados *****/
Insertar en Valores de empleado(1245,'George','Jax'), (1045,'Peter','Anadale'), (1157,'John','Dallas'), (1175,'Pete', 'Topeka'), (875,'Petron','Viena'),
(2311,'Kohli','Mumbai'), (1547,'Peter','Kansas'), (3514 ,' Abian','KHI'), (4251,'Ghani','Alejandría'), (957,'Ahmed','Viena'), (1084,'Bhanu','Manderin'),
(2954,'Ganeshan','Mclean')
/***** Insertar consulta en nueva sesión ****/
BEGIN TRAN Insertar en valores de empleado (1245 ,'George','Jax')
/**** Consulta para verificar las sesiones actualmente en ejecución ****/
SELECT DISTINCT nombre AS nombre_base_datos, id_sesión, nombre_host , login_time, login_name, lee, escribe DESDE sys.dm_exec_sessions
UNIÓN EXTERIOR IZQUIERDA sys.dm_tran_locks ON sys.dm_exec_sessions.session_id = sys.dm_tran_locks.request_session_id
UNIÓN INTERIOR sys.databases ON sys. dm_tran_locks.resource_database_id = sys.databases.database_id
DONDE tipo_recurso <> 'BASE DE DATOS' --AND nombre ='nombre de base de datos específico'
ORDENAR POR nombre
/**** actualizar consulta en nueva sesión ****/
actualizar nombre del conjunto de empleados = 'SHERAZ' donde empid = 1245
/**** Consulta a verifique las consultas de bloqueo con ID de sesión ****/
SELECT session_id, blocking_session_id, text FROM sys.dm_exec_requests CROSS APPLY sys.dm_exec_sql_text(sql_hand
le);
/*** Comando si quieres cerrar la sesión de bloqueo ****/ kill (54)
Resumen
También lo he usado Se puede utilizar una variedad de declaraciones diferentes para consultar, localizar bloqueos o incluso puntos muertos y luego resolverlos. Aquí también hay una solución temporal. Todo sigue siendo cierto, pero en última instancia es causado por muchos problemas en el código e incluso en el diseño de la base de datos, como índices faltantes, problemas con el rendimiento de las consultas y el orden lógico en las transacciones, rendimiento de las declaraciones T-SQL, etc. Es de poco valor para parte del personal de DBA que ha resuelto problemas similares durante todo el año, pero para las personas que no comprenden bien la base de datos, aún puede resolver temporalmente algunos problemas urgentes. Sentar una buena base teórica para prevenir situaciones similares en la medida de lo posible.
Lo anterior es cómo el editor le presenta cómo resolver el problema de bloqueo de sesión en SqlServer. Espero que le sea útil. Si tiene alguna pregunta, déjeme un mensaje y el editor lo hará. Responderte a tiempo. ¡También me gustaría agradecer a todos por su apoyo al sitio web de Script House!
Artículos que pueden interesarle: mysql udf programación tiempo de espera sin bloqueo retransmisión sql server 2000 problemas de bloqueo y punto muerto revisión y solución Malentendidos de SQL Server 30 días de conversación día 2 DBCC CHECKDB provocará que el bloqueo utilice sys.sysprocesses para verifique el bloqueo y el punto muerto de la aplicación SQL SqlServer en SQL2008 - Análisis de la aplicación de bloqueo de varias declaraciones SQL en espera típicas en sqlserver para consultar el estado de espera de E/S de la base de datos actual Ejemplo de práctica de declaración SQL 3 - ventas promedio El asesino invisible del sistema de tiempo de espera - bloqueo y esperando (SQL)