INF: Analizar y evitar los interbloqueos en SQL Server

Seleccione idioma Seleccione idioma
Id. de artículo: 169960 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Microsoft SQL Server mantiene la coherencia transaccional integridad y la base de datos mediante el uso de bloqueos. SQL Server versión 6.5, opcionalmente, se utiliza el bloqueo de fila para las operaciones de inserción y se utiliza bloqueo de página para otras operaciones. Como con cualquier sistema de base de datos relacional, el bloqueo puede producir interbloqueos entre usuarios.

Por ejemplo, supongamos que Usuario1 (o Conexión1) tiene un bloqueo datos de artículos "A" y desea un bloqueo en el elemento de datos "B" Usuario2 tiene un bloqueo en el elemento de datos "B" y ahora desea un bloqueo en el elemento de datos "a". En este escenario de SQL Server, o User1 como User2 será una víctima del interbloqueo y el otro usuario se le concederá el bloqueo solicitado.

En SQL Server, el desarrollador de la aplicación puede decidir qué conexión estará el candidato para la víctima del interbloqueo utilizando SET DEADLOCK_PRIORITY. Si el desarrollador no designa una prioridad para los interbloqueos, SQL Server selecciona a la víctima del interbloqueo eligiendo el proceso que finaliza la cadena de bloqueos circular.

Aplicación de base de datos pueden comportarse sistemas diferente cuando adaptado de una base de datos relacional a otro, según la implementación de sistema de bases de datos relacionales. Una de las áreas para buscar cambios de comportamiento del bloqueo. En este artículo se explica cómo analizar los interbloqueos en SQL Server y las técnicas que puede utilizar para evitarlos.

Más información

En este artículo destaca con el resultado del indicador de traza T1204 para analizar los interbloqueos. Cuando se establece el indicador de traza T1204, SQL Server imprime información sobre el interbloqueo cuando se produce. Para utilizar este indicador de traza, utilice el comando siguiente en un símbolo del sistema para iniciar SQL Server:
   sqlservr -c -T1204
				

Los resultados del seguimiento se envían a la ventana de consola, salvo que establezca el indicador de traza T3605, que envía el resultado de seguimiento en el registro de errores.

Pueden producirse interbloqueos cuando dos conexiones actualizan las tablas en orden inverso. Por ejemplo, una conexión inserta en "ejemplo1" en la primera tabla y, a continuación, en "ejemplo2", mientras que otra conexión inserta en la tabla "ejemplo2" en la primera y, a continuación, en "ejemplo1" dentro de una transacción. Un escenario de ejemplo es útil para ilustrar cómo evitar interbloqueos.

Las instrucciones SQL usadas para crear la tabla utilizada en este ejemplo son:
   create table example1 (column1 int, column2 char(20), column3 char(50))
   go
   create table example2 (column1 int, column2 char(20), column3 char(50))
   go
   declare @lvar int
   select @lvar = 0
   while @lvar < 500
   begin
   insert into example1 values (@lvar, 'AAA', 'CCC')
   insert into example2 values (@lvar, 'AAA', 'CCC')
   select @lvar = @lvar + 1
   end
   go
   create unique clustered index ex1ind1 on example1 (column1, column2)
   with fill factor = 90, PAD_INDEX
   go
   create unique clustered index ex2ind1 on example2 (column1, column2)
   with fill factor = 90, PAD_INDEX
   go
				

Ejemplo 1: Inserciones de tabla en el orden opuesto

En este ejemplo, dos tablas insertadas en orden inverso y se ha producido un interbloqueo. También se pueden producir interbloqueos cuando dos o más conexiones realizan eliminaciones o actualizaciones en tablas en orden inverso.
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example2 VALUES (200, 'AAAB', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (200, 'AAAB', 'CCC')
				

En este momento, Conexión1 puede bloquear Conexión2 porque la fila de que inserción Conexión2 puede estar en la misma página donde Conexión1 ya ha insertado una fila y es mantener un bloqueo.
   Connection1 > INSERT INTO example2 VALUES (100, 'AAAA', 'CCC')
				

En este momento, Conexión2 puede bloquear Conexión1, porque la fila de que inserción Conexión1 puede estar en la misma página donde Conexión2 ya ha insertado una fila y se mantiene un bloqueo. Esto causa un interbloqueo.

Ésta es la salida de indicador de traza 1204 cuando se produjo el interbloqueo:
97/04/20 11:51:57.88 spid13   *** DEADLOCK DETECTED with spid 14 ***
   spid 13 requesting EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 14, dbid 6, page 0x188, table example2, indid 0x1
     pcurcmd INSERT(0xc3), input buffer: INSERT INTO example2 VALUES (100,
     'AAAA', 'CCC')
   spid 14 waiting for EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 13, dbid 6, page 0x180, table example1, indid 0x1
     pcurcmd INSERT(0xc3), input buffer: INSERT INTO example1 VALUES (200,
   'AAAB', 'CCC')
   VICTIM: spid 13, pstat 0x0000 , cputime 30
				

Cada línea de la traza de interbloqueo puede indicar a los usuarios más información acerca de un interbloqueo. Conexión1 es spid 13 y Conexión2 spid 14 (puede determinar el spid asociado con una conexión mediante el procedimiento de almacenado del sistema sp_who).
   >> 97/04/20 11:51:57.88 spid13   *** DEADLOCK DETECTED with spid 14 ***
   The deadlock was detected between spid 13 and spid 14.
   >> spid 13 requesting EX_PAGE (waittype 0x8005), blocked by:
   >>   EX_PAGE: spid 14, dbid 6, page 0x188, table example2, indid 0x1
   >>   pcurcmd INSERT(0xc3), input buffer: INSERT INTO example2 VALUES
   (100, 'AAAA', 'CCC')
				

SPID 13 se estaba solicitando EX_PAGE bloqueo y se bloqueó spid 14, que ya tiene bloqueo EX_PAGE página 0x188 en tabla ejemplo2 en dbid 6. El bloqueo se mantiene en la página de índice agrupado.
      Indid Value         Description
-------------------------------------
         0                Data page if there is no clustered index, or the
                          leaf page of a clustered index if there is one
         1                Non-leaf page of the clustered index page
       255                Text/image page
    Any other value       Non-clustered secondary index
				

El comando actual ejecutado spid 13 es una INSERCIÓN y el seguimiento ofrece parte del búfer de entrada.
   >> spid 14 waiting for EX_PAGE (waittype 0x8005), blocked by:
   >>   EX_PAGE: spid 13, dbid 6, page 0x180, table example1, indid 0x1
   >>   pcurcmd INSERT(0xc3), input buffer: INSERT INTO example1 VALUES
   (200, 'AAAB', 'CCC')
				

14 De SPID está en espera para bloqueo EX_PAGE y está bloqueando el spid 13, que ya contiene EX_PAGE bloqueo en la misma página.
   >> VICTIM: spid 13, pstat 0x0000 , cputime 30
   SQL Server has chosen spid 13 as the deadlock victim.
				

Ésta es una explicación del significan de los bloqueos distintos en la traza:

SH_INT y EX_INT
Bloqueos de intención se toman antes de nivel inferior (por ejemplo, una página) se bloquee un elemento de nivel superior (por ejemplo, una tabla) se pueden tomar, porque el Administrador de bloqueos es conscientes de la relación entre diferentes tipos de elementos (en este caso, las páginas y tablas). Si un bloqueo EX_INT no se realizó en la tabla antes de tomar EX_PAG bloqueos en las páginas, otro usuario podría realizar un bloqueo EX_TAB en la misma tabla y el Administrador de bloqueos no sabría que existía un conflicto. Actualmente, SQL Server tiene los bloqueos con intención sólo en tablas. Hay dos tipos de bloqueos de intención: bloqueos compartidos (SH_INT) y exclusivo (EX_INT).

EX_PAGE
Se trata de un bloqueo exclusivo de la página que se realiza cuando se actualiza una página debido a un DELETE, UPDATE, o la instrucción INSERT con insertar bloqueo de filas (IRL) deshabilitado.

UP_PAGE
Esto es un bloqueo de página de actualización que se realiza en lugar de un bloqueo de página compartido cuando se examina una página y el optimizador sabe que se actualizará la página (o se utiliza la sugerencia UPDLOCK).

PR_EXT, NX_EXT, UPD_EXT y EX_EXT
Estos bloqueos se toman al asignar o desasignar espacio en disco. UPD_EXT se realiza al asignar o desasignar una página de una extensión existente y el resto se utilizan al asignar o desasignar toda extensiones.

IX_PAGE y LN_PAGE
Estos son IRL bloqueos. IX_PAGE es un bloqueo de intención-a---bloqueo de filas en una página. LN_PAGE se toma cuando una página en el que IRL está realizando debe dividirse.

RLOCK y XRLOCK
Estos bloqueos a corto plazo se toman al atravesar un árbol b del índice. Hay dos tipos de este tipo de bloqueo: (RLOCK) compartido y exclusivo (XRLOCK). Se toman bloqueos compartidos durante la detección, mientras se toman bloqueos exclusivos en páginas de índice durante una actualización.

EX_TAB
Se trata de un bloqueo exclusivo de tabla que se produce cuando el optimizador de SQL Server determina que un recorrido de tabla es la forma más eficaz para resolver una consulta de actualización (por ejemplo, cuando no hay índices en una tabla). Bloqueos EX_TAB aparecen también al bloquear la tabla con la sugerencia TABLOCKX o cuando los bloqueos de página en una tabla a un bloqueo de tabla de escala de SQL Server.

SH_TAB
Esto es un objeto compartido se examinarán el bloqueo de tabla que se utiliza cuando el optimizador supone que la mayor parte de la tabla (o escala de bloqueo de página) o se utiliza la sugerencia TABLOCK.

El ejemplo de interbloqueo anterior puede evitarse si las dos conexiones actualizan tablas en la siguiente secuencia:
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (200, 'AAAB', 'CCC')
   Connection2 > INSERT INTO example2 VALUES (200, 'AAAB', 'CCC')
   Connection1 > INSERT INTO example2 VALUES (100, 'AAAA', 'CCC')
				

Ejemplo 2: Inserciones a diferentes partes de la misma tabla

También puede producirse este interbloqueo cuando dos conexiones se insertarán en distintas partes de la misma tabla en orden opuesto al filas compartan páginas. Por ejemplo:
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (400, 'AAAB', 'CCC')
   Connection1 > INSERT INTO example1 VALUES (400, 'AAAA', 'CCC')
				

En esta tabla de ejemplo, hay en contacto con un índice agrupado en la primera columna de la tabla ejemplo1. Filas con los mismos valores para la primera columna tenderá a caen en la misma página. En el ejemplo, la segunda fila insertada por Conexión1 probablemente se producirá en la misma página como la primera fila insertada por Conexión2, ya que ambos tienen un valor de índice agrupado de 400. Esto hace que Conexión2 bloque Conexión1.
   Connection2 > INSERT INTO example1 VALUES (100, 'AAAB', 'CCC')
				

Ahora es posible que también esté bloqueado por Conexión1, conduce a un interbloqueo Conexión2. Ésta es la traza de interbloqueo:
   97/04/20 12:56:01.40 spid16   *** DEADLOCK DETECTED with spid 15 ***
   spid 16 requesting EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 15, dbid 6, page 0x2c5, table example1, indid 0
     pcurcmd INSERT(0xc3), input buffer: INSERT INTO example1 VALUES (100,
   'AAAB', 'CCC')
   spid 15 waiting for EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 16, dbid 6, page 0x8bd, table example1, indid 0
     pcurcmd INSERT(0xc3), input buffer: INSERT INTO example1 VALUES (400,
   'AAAA', 'CCC')
   VICTIM: spid 16, pstat 0x0000 , cputime 130
				

La solicitud de spid 16 para EX_PAGE bloqueo de página 0x2c5 está bloqueada por spid 15, que ya contiene EX_PAGE bloqueo de página 0x2c5 después de que tenía la primera inserción. Y spid 15 también tiene bloqueado spid 16 en espera un bloqueo EX_PAGE para página 0x8db inicial a un interbloqueo.

Este interbloqueo puede evitarse mediante el siguiente comando para habilitar IRL para ejemplo1 tabla:
   sp_tableoption 'example1', 'insert row lock', true
				

Ejemplo 3: Inserciones utilizar IRL

IRL permite que dos o más usuarios compartan una página cuando se insertan sólo operaciones, que a menudo da como resultado un mejor rendimiento. Sin embargo, habilitar IRL no siempre reducirá los interbloqueos. En algunos casos, IRL puede producir interbloqueos.
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (105, 'AAAB', 'CCC')
				

Con IRL habilitado, ambas conexiones mantenga un bloqueo IX_PAGE en la página que contiene las dos nuevas filas. Si deshabilitó IRL, Conexión1 sería ha adquirido un bloqueo EX_PAGE y Conexión2 se han bloqueado inmediatamente.
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 105
   and column2 = 'AAAB'
				

En este momento, Conexión2 necesita un bloqueo de página exclusivo para realizar una instrucción UPDATE, que es incompatible con IX_PAGE bloqueo del Conexión1. Por lo tanto, esperará Conexión2.
   Connection1 > UPDATE example1 SET column3 = 'CCCA' where column1 = 100
   and column2 = 'AAAA'
				

Ahora Conexión1 pueden estar bloqueados por Conexión2, conduce a un interbloqueo. Ésta es la traza de interbloqueo:
   97/04/20 15:13:50.07 spid17   *** DEADLOCK DETECTED with spid 18 ***
   spid 17 requesting UP_PAGE (waittype 0x8007), blocked by:
     IX_PAGE: spid 18, dbid 6, page 0x2c5, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCA' where column1 = 100 and column2 = 'AAAA'
   spid 18 waiting for UP_PAGE (waittype 0x8007), blocked by:
     IX_PAGE: spid 17, dbid 6, page 0x2c5, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCB' where column1 = 105 and column2 = 'AAAB'
   VICTIM: spid 17, pstat 0x0000 , cputime 20
				

17 De SPID (conexión uno) está esperando un bloqueo UP_PAGE, que es el primer paso para obtener un bloqueo exclusivo de la página. Se está bloqueando spid 18, que contiene el bloqueo IX_PAGE en página 0x2c5. 18 De SPID está esperando UP_PAGE bloqueo en la misma página y está bloqueando IX_PAGE bloqueo mantenido por el spid 17. Esto conduce a un interbloqueo porque IX_PAGE bloqueo es compartible, mientras que UP_LOCK no es. Durante las primera inserciones, tanto el SPID tiene IX_PAGE bloqueo en la misma página y más adelante en el intentaron actualizar el bloqueo a bloqueo UP_PAGE, que no es posible porque UP_PAGE bloqueo exclusivo.

La uno forma de evitar el interbloqueo es insertar el valor actualizado directamente en la tabla en lugar de insertar y, a continuación, actualizar la fila en la misma transacción. Si no es posible, mediante el comando siguiente para deshabilitar IRL ayudará a evitar el interbloqueo:
   sp_tableoption 'example1', 'insert row lock', false
				

Ejemplo 4: Inserciones a la fila en la misma página

También puede producir un interbloqueo cuando son diferentes de las filas que está trabajando el dos SPID pero pertenecen a la misma página.
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (400, 'AAAB', 'CCC')
   Connection1 > UPDATE example1 SET column3 = 'CCCA' where column1 = 405
   and column2 = 'AAAA'
				

En este punto, pueden estar bloqueados Conexión1 por Conexión2. Esta situación puede producirse porque Conexión1 desea actualizar una fila en una página donde Conexión2 ya ha insertado una fila.
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 105
   and column2 = 'AAAB'
				

En este momento, es posible que también esté bloqueado por Conexión1, lo que se provocar un interbloqueo Conexión2. Esta situación puede producirse cuando Conexión2 desea actualizar una fila en una página donde Conexión1 ha insertado una fila. Ésta es la traza de interbloqueo:
   97/04/20 15:48:21.18 spid20   *** DEADLOCK DETECTED with spid 19 ***
   spid 20 requesting UP_PAGE (waittype 0x8007), blocked by:
     EX_PAGE: spid 19, dbid 6, page 0x2c4, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCB' where column1 = 105 and column2 = 'AAAB'
   spid 19 waiting for UP_PAGE (waittype 0x8007), blocked by:
     EX_PAGE: spid 20, dbid 6, page 0xc48, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCA' where column1 = 405 and column2 = 'AAAA'
   VICTIM: spid 20, pstat 0x0000 , cputime 60
				

Este interbloqueo puede evitarse mediante propagación fuera las filas a través de diferentes páginas. El uno método para hacerlo es volver a crear el índice agrupado en esta tabla con un factor de relleno gran. Ésta es una instrucción que crea un índice agrupado con un factor de relleno del 50 por ciento:
   create unique clustered index ex1ind1 on example1 (column1, column2)
   with fill factor = 50, PAD_INDEX
				

Esta instrucción crea el índice agrupado dejar la mitad de las páginas vacío, incluyendo los niveles sin hojas del índice agrupado (debido a de la opción PAD_INDEX). La tabla ocupa el doble del tamaño real y el número de filas por página es la mitad de lo que eran anteriormente.

No se mantiene el factor de relleno en una tabla; la tabla es reorganizó con el factor de relleno especificado sólo durante la hora de creación de índice. A lo largo del tiempo, las filas por página cambiará desde el factor de relleno especificado durante la creación de índice. Cuando esto ocurre, puede ser una buena idea para volver a crear el índice agrupado con el factor de relleno deseado.

Otra solución para evitar la situación de interbloqueo anterior es rellenar la tabla con columnas ficticios (por ejemplo, dummy1 char(255)). Esto aumenta el tamaño de la fila y conlleva menos filas por página (tan sólo una fila por página). Debido a que este tipo de relleno se mantienen a lo largo del tiempo, no es necesario volver a crear el índice agrupado para mantener el relleno (aunque quizás desee volver a crear el índice agrupado por otras razones). La desventaja de esta técnica es que se desperdicia espacio de almacenamiento en campos ficticios.

Ejemplo 5: Relleno filas

Relleno filas conduce a menos filas por página (por lo tanto menos interbloqueos), pero no se elimina completamente los interbloqueos.

En esta tabla de ejemplo, se rellenan ejemplo1 para ocupar una fila por página. Las instrucciones utilizadas para crear la tabla para este ejemplo son:
   create table example1 (column1 int, column2 char(20), column3 char(50),
   dummy_column4 char (255), dummy_column5 char (255), dummy_column6 char
   (255))
   go
   create unique index ex1ind5 on example1 (column3, column2, column1,
   dummy_column4, dummy_column5, dummy_column6) with fill factor = 85
   go
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC', ' ', ' ',
   ' ', ' ')
   Connection2 > INSERT INTO example1 VALUES (400, 'AAAB', 'CCC', ' ', ' ',
   ' ', ' ')
   Connection1 > UPDATE example1 SET column3 = 'CCCA' where column1 = 401
   and column2 = 'AAAA'
				

En este momento, Conexión1 está bloqueada por Conexión2 al actualizar la fila. Dado que SQL Server debe mantiene punteros de cadena de páginas, bloquea la página anterior, la siguiente página y la página que se está actualizando. Debido a que Conexión2 mantiene un bloqueo en la página anterior, Conexión1 debe esperar hasta que Conexión2 confirma la transacción.
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 101
   and column2 = 'AAAB'
				

En este momento, Conexión2 está bloqueada por Conexión1 porque debe bloquear la página anterior, que está bloqueada actualmente por Conexión1. El resultado es un interbloqueo. Ésta es la traza de interbloqueo:
   spid 20 requesting UP_PAGE (waittype 0x8007), blocked by:
     EX_PAGE: spid 19, dbid 6, page 0x12b5, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCB' where column1 = 101 and column2 = 'AAAB'
   spid 19 waiting for UP_PAGE (waittype 0x8007), blocked by:
     EX_PAGE: spid 20, dbid 6, page 0x1531, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCA' where column1 = 401 and column2 = 'AAAA'
   VICTIM: spid 20, pstat 0x0000 , cputime 300
				

Este interbloqueo puede evitarse insertando filas ficticios entre las filas que se insertan, actualizado o eliminado. Por ejemplo, si Conexión1 trabaja (inserciones, actualizaciones o eliminaciones) pk fila = 1 y Conexión2 funciona con fila pk = 5, insertar una fila entre estas dos filas (como una fila que contiene pk = 3) se evitar interbloqueos. Este método también aumenta el tamaño de la tabla, pero puede ser la mejor solución para dichas tablas cola críticas para la aplicación.

Ejemplo 6: Índices no agrupados

En algunos casos, los índices secundarios no agrupados pueden producir interbloqueos. En este ejemplo, el mantenimiento del índice secundario presenta el interbloqueo.

Ésta es la instrucción utilizada para crear el índice secundario utilizado en este ejemplo:
   create index ex1ind2 on example1 (column3) with fill factor = 90,
   PAD_INDEX
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCBA', ' ', '
   ', ' ', ' ')
   Connection2 > INSERT INTO example1 VALUES (300, 'AAAB', 'CCCZ', ' ', '
   ', ' ', ' ')
   Connection2 > UPDATE example1 SET column3 = 'CCBA' where column1 = 105
				

En este momento, Conexión2 puede bloquear Conexión1 porque Conexión1 es posible que se mantiene un bloqueo en la página secundaria non-clustered index donde Conexión2 necesita actualizar.
   Connection1 > UPDATE example1 SET column3 = 'CCCZ' where column1 = 305
				

En este punto, pueden estar bloqueados Conexión1 por Conexión2, dando como resultado un interbloqueo. Esta situación puede ocurrir cuando Conexión1 está esperando un bloqueo de actualizar el índice secundario no agrupado donde Conexión2 ya ha insertado y mantiene un bloqueo en esa página. Ésta es la traza de interbloqueo en este ejemplo de interbloqueo:
   97/04/20 19:05:38.75 spid11   *** DEADLOCK DETECTED with spid 12 ***
   spid 11 requesting EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 12, dbid 6, page 0x112f, table example1, indid 0x2
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCZ' where column1 = 305
   spid 12 waiting for EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 11, dbid 6, page 0x1108, table example1, indid 0x2
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCBA' where column1 = 105
   VICTIM: spid 11, pstat 0x0000 , cputime 50
				

Este interbloqueo puede evitarse colocando el índice secundario. No es posible rellenar el índice para contener una fila por página, por lo que puede evitar esta situación, sólo elimina el índice secundario no agrupado o modificando la aplicación.

Pueden producirse interbloqueos con más de dos conexiones, en cuyo caso la traza de interbloqueo muestra el SPID implicados en el interbloqueo y también los bloqueos en conflicto. Pueden producirse interbloqueos con bloqueos RLOCK y XRLOCK, adquiridas durante el recorrido de índice. También pueden producirse interbloqueos debido de bloqueos de extensión (PR_EXT, NX_EXT UPD_EXT & EX_EXT).

Para obtener información adicional acerca analizar interbloqueos, puede habilitar los siguientes indicadores de traza:

T1200
Imprime todas la información de versión/solicitud de bloqueo cuando se produce, si está implicado un interbloqueo o no. Esto es costoso en términos de rendimiento, pero puede resultar útil para el análisis.

T1206
Imprime todos los bloqueos mantenidos por el SPID que participan en el interbloqueo.

T1208
Imprime el nombre de host y el nombre del programa suministrado por el cliente. Esto puede ayudar a identificar un cliente que participan en un interbloqueo, suponiendo que el cliente especifica un valor único para cada conexión.

Propiedades

Id. de artículo: 169960 - Última revisión: jueves, 16 de octubre de 2003 - Versión: 3.0
La información de este artículo se refiere a:
  • Microsoft SQL Server 6.5 Standard Edition
Palabras clave: 
kbmt kbhowto kbusage KB169960 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 169960
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com