Puntos muertos de las cerraduras en las mismas tablas temporales en diferentes procesos


17

He encontrado un punto muerto que parece mostrar algo que pensé que era imposible. Hay dos procesos involucrados en el punto muerto:

1. process8cf948 SPID 63

  • Realizar una ALTER TABLE en la tabla temporal #PB_Cost_Excp_Process_Invoices_Work.

  • Posee IX bloqueo en la tabla #PB_Cost_Excp_Process_Invoices_Work con ID de objeto 455743580

2. process4cb3708 SPID 72

  • Realización en ACTUALIZACIÓN en la tabla temporal #PB_Cost_Excp_Process_Invoices_Work que se supone que es su propia copia única de la tabla.

  • ¡Posee el bloqueo Sch-M en #PB_Cost_Excp_Process_Invoices_Work con el mismo ID de objeto 455743580 !

Se supone que esto es imposible. ¿Me estoy perdiendo de algo? ¿Realmente se reutilizó una tabla #Temporary entre estos dos SPID?

Esto está en SQL Server 2008 R2 Service Pack 2 con la actualización acumulativa 1 (versión 10.50.4260).

El rastro completo del punto muerto sin alteraciones está debajo. Observe cómo ambos procesos funcionan en el mismo ID de objeto con el mismo nombre de tabla # PB_Cost_Excp_Process_Invoices_Work_SNIP_0000000D8519:

12/14/2012 13:46:03,spid23s,Unknown,waiter id=process8cf948 mode=X requestType=wait
12/14/2012 13:46:03,spid23s,Unknown,waiter-list
12/14/2012 13:46:03,spid23s,Unknown,owner id=process4cb3708 mode=Sch-M
12/14/2012 13:46:03,spid23s,Unknown,owner-list
12/14/2012 13:46:03,spid23s,Unknown,objectlock lockPartition=0 objid=455743580 subresource=FULL dbid=2 objectname=tempdb.dbo.#PB_Cost_Excp_Process_Invoices_Work_________________________________________________________________________________0000000D8519 id=lock371705d00 mode=Sch-M associatedObjectId=455743580
12/14/2012 13:46:03,spid23s,Unknown,waiter id=process4cb3708 mode=Sch-M requestType=wait
12/14/2012 13:46:03,spid23s,Unknown,waiter-list
12/14/2012 13:46:03,spid23s,Unknown,owner id=process8cf948 mode=IX
12/14/2012 13:46:03,spid23s,Unknown,owner-list
12/14/2012 13:46:03,spid23s,Unknown,objectlock lockPartition=3 objid=455743580 subresource=FULL dbid=2 objectname=tempdb.dbo.#PB_Cost_Excp_Process_Invoices_Work_________________________________________________________________________________0000000D8519 id=lock3139b4780 mode=IX associatedObjectId=455743580
12/14/2012 13:46:03,spid23s,Unknown,resource-list
12/14/2012 13:46:03,spid23s,Unknown,Proc [Database Id = 8 Object Id = 1857974987]
12/14/2012 13:46:03,spid23s,Unknown,inputbuf
12/14/2012 13:46:03,spid23s,Unknown,EXEC PB_ProcessExc_Costs_Submit_SP @SiteKey, @PWDate
12/14/2012 13:46:03,spid23s,Unknown,frame procname=PDICompany_218_01.dbo.DR_SubmitPaperwork_SP line=174 stmtstart=12912 stmtend=13018 sqlhandle=0x03000800cb72be6e500434018da000000100000000000000
12/14/2012 13:46:03,spid23s,Unknown,EXEC PB_ProcessExc_Costs_Create_SP

    -- Clean up work table
12/14/2012 13:46:03,spid23s,Unknown,frame procname=PDICompany_218_01.dbo.PB_ProcessExc_Costs_Submit_SP line=138 stmtstart=11890 stmtend=12012 sqlhandle=0x03000800428c1f1950f833018da000000100000000000000
12/14/2012 13:46:03,spid23s,Unknown,UPDATE #PB_Cost_Excp_Process_Invoices_Work
    SET PBCEPrcInv_RtlPkg_Item_Quantity = RtlPkg_Item_Quantity
    FROM #PB_Cost_Excp_Process_Invoices_Work
        INNER JOIN Item_Packages (NOLOCK)
            ON PBCEPrcInv_ItemPkg_Key = ItemPkg_Key
        INNER JOIN Retail_Packages (NOLOCK)
            ON ItemPkg_RtlPkg_Key = RtlPkg_Key

    -- Lookup pricebook cost
12/14/2012 13:46:03,spid23s,Unknown,frame procname=PDICompany_218_01.dbo.PB_ProcessExc_Costs_Create_SP line=25 stmtstart=2394 stmtend=3050 sqlhandle=0x030008003a082846321f46018da000000100000000000000
12/14/2012 13:46:03,spid23s,Unknown,executionStack
12/14/2012 13:46:03,spid23s,Unknown,process id=process8cf948 taskpriority=0 logused=0 waitresource=OBJECT: 2:455743580:0  waittime=3739 ownerId=707053534 transactionname=UPDATE lasttranstarted=2012-12-14T13:45:59.327 XDES=0x3c4502930 lockMode=X schedulerid=4 kpid=7276 status=suspended spid=72 sbid=0 ecid=0 priority=0 trancount=2 lastbatchstarted=2012-12-14T13:45:58.337 lastbatchcompleted=2012-12-14T13:45:58.337 clientapp=PDI WCF Services - pdidb01-PDIMaster.cfg hostname=PDIWEB01 hostpid=2084 loginname=pdiuser isolationlevel=read committed (2) xactid=707053534 currentdb=8 lockTimeout=4294967295 clientoption1=673316896 clientoption2=128568
12/14/2012 13:46:03,spid23s,Unknown,Proc [Database Id = 8 Object Id = 1857974987]
12/14/2012 13:46:03,spid23s,Unknown,inputbuf
12/14/2012 13:46:03,spid23s,Unknown,EXEC PB_ProcessExc_Costs_Submit_SP @SiteKey, @PWDate
12/14/2012 13:46:03,spid23s,Unknown,frame procname=PDICompany_218_01.dbo.DR_SubmitPaperwork_SP line=174 stmtstart=12912 stmtend=13018 sqlhandle=0x03000800cb72be6e500434018da000000100000000000000
12/14/2012 13:46:03,spid23s,Unknown,EXEC dbo.PB_ProcessExc_Costs_CreateInvoiceWorkTable_SP
12/14/2012 13:46:03,spid23s,Unknown,frame procname=PDICompany_218_01.dbo.PB_ProcessExc_Costs_Submit_SP line=58 stmtstart=5782 stmtend=5894 sqlhandle=0x03000800428c1f1950f833018da000000100000000000000
12/14/2012 13:46:03,spid23s,Unknown,ALTER TABLE #PB_Cost_Excp_Process_Invoices_Work DROP COLUMN PBCEPrcInv_Filler
12/14/2012 13:46:03,spid23s,Unknown,frame procname=PDICompany_218_01.dbo.PB_ProcessExc_Costs_CreateInvoiceWorkTable_SP line=50 stmtstart=5382 stmtend=5538 sqlhandle=0x0300080025d75a14ffff4701969f00000100000000000000
12/14/2012 13:46:03,spid23s,Unknown,executionStack
12/14/2012 13:46:03,spid23s,Unknown,process id=process4cb3708 taskpriority=0 logused=0 waitresource=OBJECT: 2:455743580:3  waittime=3739 ownerId=707052778 transactionname=ALTER TABLE lasttranstarted=2012-12-14T13:45:58.517 XDES=0x5f48bce80 lockMode=Sch-M schedulerid=6 kpid=7212 status=suspended spid=63 sbid=0 ecid=0 priority=0 trancount=1 lastbatchstarted=2012-12-14T13:45:58.513 lastbatchcompleted=2012-12-14T13:45:58.513 clientapp=PDI WCF Services - pdidb01-PDIMaster.cfg hostname=PDIWEB01 hostpid=2084 loginname=pdiuser isolationlevel=read committed (2) xactid=707052778 currentdb=2 lockTimeout=4294967295 clientoption1=673316896 clientoption2=128568
12/14/2012 13:46:03,spid23s,Unknown,process-list
12/14/2012 13:46:03,spid23s,Unknown,deadlock victim=process4cb3708
12/14/2012 13:46:03,spid23s,Unknown,deadlock-list

ACTUALIZAR

La máquina en cuestión muestra 16 procesadores en el Administrador de tareas y el Administrador de dispositivos, por lo que la partición de bloqueo está habilitada y los dos bloqueos están en particiones de bloqueo diferentes. No sé si la partición de bloqueo es una causa contribuyente aquí o no.

También encontré esta publicación intrigante en el blog CSS SQL Server Engineers .

ACTUALIZACIÓN 2

Las tablas temporales se eliminan al final de cada procedimiento almacenado. Se crean con el patrón crear #table, modificar esquema, insertar, actualizar, seleccionar y luego soltar. Hay varios puntos de entrada a un procedimiento común que utiliza esta tabla temporal #, por lo que tenemos un proceso central que configura las columnas necesarias para llamar al proceso común. De lo contrario, tendríamos que replicar la misma definición #table en todos los procesos de punto de entrada.

El proceso se invoca con frecuencia desde múltiples aplicaciones de cliente. Algunas de las aplicaciones cliente llaman a este proceso desde múltiples hilos. Otros lo ejecutan uno a la vez. Piense en el software de inventario / contabilidad donde la oficina en el hogar está procesando datos de miles de tiendas en paralelo, mientras que las tiendas también ejecutan el mismo proceso. Entonces, si este es un problema raro cuando la partición de bloqueo está habilitada, no será tan raro en nuestras bases de datos de clientes más grandes.

ACTUALIZACIÓN 3 - 2012-12-19

Otro cliente tiene el mismo problema en SQL Server 2012 build 11.0.2100. No vi ninguna mención de una solución para este problema en las descripciones de actualización acumulativa. Investigando

ACTUALIZACIÓN 4 - 2013-02-13

Microsoft ha publicado la solución para este error en las siguientes actualizaciones:


@AaronBertrand: No, no queremos el almacenamiento en caché de la tabla #temp. Eso sería lo suficientemente malo en la misma conexión, mucho menos ser reutilizado entre procesos. No tengo un archivo .xdl, solo la información de la marca de seguimiento 1222.
Paul Williams

Estamos cayendo explícitamente estas tablas #temp cuando terminamos con ellas.
Paul Williams

2
Todavía sugeriría capturar y publicar el archivo .xdl en algún lugar para que otros puedan echar un vistazo más de cerca, tendrá mucho mejor detalle.
Aaron Bertrand

2
Puedo confirmar que la partición de bloqueo está involucrada aquí. Estas publicaciones tienen algunos detalles sobre el análisis de puntos muertos que involucran y debido a particiones de bloqueo. bit.ly/Ruzmym bit.ly/W7yuRK Pero no sé por qué ambas sesiones publicaron el mismo ObjectID.
Roji P Thomas

@SQLKiwi ¡Gracias por mirar el problema! No pensé en bloquear el hashing de recursos. Dado que está en una identificación de objeto, sospecho que ese no es el caso, pero solo estoy adivinando. El cliente nos ha estado informando puntos muertos durante varios días. Solo tengo 1 día de rastreo de punto muerto, pero apuesto a que este es el punto muerto que han estado experimentando. Estamos abriendo un ticket de soporte con Microsoft para ayudarnos a resolverlo. Actualizaré esta pregunta a medida que aprenda más.
Paul Williams

Respuestas:



4

Habíamos abierto un caso con Microsoft con respecto a este problema. Microsoft confirmó que este error también afecta a SQL Server 2012. Están planeando lanzar la solución en SQL Server 2012 Service Pack 2 (no publicado en el momento en que escribía esta respuesta).

Hasta que Microsoft lance este paquete de servicio, los usuarios de SQL Server 2012 pueden evitar el problema al deshabilitar la partición de bloqueo mediante el indicador de rastreo 1229 .

Tenga en cuenta que este problema solo se aplica a máquinas que tienen 16 o más procesadores.

Más información sobre particiones de bloqueo

¡Gracias al soporte de Microsoft! Fueron muy rápidos y serviciales.

ACTUALIZAR

El error se corrigió en la actualización acumulativa 2 de SQL Server 2012 para SQL Server 2012 SP 1 .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.