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:
fuente
Respuestas:
Este problema exacto se acaba de anunciar en Deadlocks cuando se ejecuta un procedimiento almacenado para modificar una tabla temporal si la partición de bloqueo está habilitada en SQL Server 2008 R2 . Está vinculado desde el paquete de actualización acumulativa 4 para SQL Server 2008 R2 SP2 .
Finalmente vale la pena leer las descripciones de arreglos de SQL Server.
fuente
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 .
fuente