내가 불가능하다고 생각한 것을 보여주는 교착 상태를 발견했습니다. 교착 상태와 관련된 두 가지 프로세스가 있습니다.
1. process8cf948 SPID 63
임시 테이블 #PB_Cost_Excp_Process_Invoices_Work에서 ALTER TABLE 수행
오브젝트 ID가 455743580 인 테이블 #PB_Cost_Excp_Process_Invoices_Work에서 IX 잠금을 소유합니다.
2. process4cb3708 SPID 72
임시 테이블 #PB_Cost_Excp_Process_Invoices_Work에서 UPDATE로 수행하며, 고유 한 테이블 사본이어야합니다.
동일한 객체 ID가 455743580 인 #PB_Cost_Excp_Process_Invoices_Work 에서 Sch-M 잠금을 소유 합니다 !
불가능합니다. 뭔가 빠졌습니까? 이 두 SPID간에 #Temporary 테이블이 실제로 재사용 되었습니까?
누적 업데이트 1 (버전 10.50.4260)이 포함 된 SQL Server 2008 R2 서비스 팩 2에 있습니다.
변경되지 않은 전체 교착 상태 추적은 다음과 같습니다. 두 프로세스가 모두 테이블 이름이 # PB_Cost_Excp_Process_Invoices_Work_SNIP_0000000D8519 인 동일한 오브젝트 ID에서 어떻게 작동하는지 참고하십시오.
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
최신 정보
해당 시스템은 작업 관리자 및 장치 관리자에 16 개의 프로세서를 표시하므로 잠금 파티셔닝이 활성화되고 두 잠금이 서로 다른 잠금 파티션에 있습니다. 잠금 파티셔닝이 여기서 중요한 원인인지 아닌지 모르겠습니다.
CSS SQL Server Engineers 블로그에서이 흥미로운 게시물을 찾았 습니다 .
업데이트 2
임시 테이블은 모든 저장 프로 시저의 끝에서 삭제됩니다. 패턴 작성 #table, 스키마 수정, 삽입, 업데이트, 선택 및 삭제 패턴으로 작성됩니다. 이 임시 테이블을 사용하는 공통 프로 시저에는 여러 개의 진입 점이 있으므로 공통 proc을 호출하는 데 필요한 열을 설정하는 중앙 proc이 있습니다. 그렇지 않으면 모든 진입 점 프로세스에서 동일한 #table 정의를 복제해야합니다.
프로세스는 여러 클라이언트 애플리케이션에서 자주 호출됩니다. 일부 클라이언트 응용 프로그램은 여러 스레드에서이 프로세스를 호출합니다. 다른 사람들은 한 번에 하나씩 실행합니다. 본사가 수천 개의 매장에 대한 데이터를 동시에 처리하는 동안 재고 / 회계 소프트웨어를 생각해보십시오. 따라서 잠금 파티셔닝이 활성화 될 때 이것이 드문 문제인 경우, 더 큰 고객 데이터베이스에서는 드물지 않을 것입니다.
업데이트 3-2012-12-19
다른 고객이 SQL Server 2012 빌드 11.0.2100에서 동일한 문제를 겪고 있습니다. 누적 업데이트 설명에서이 문제에 대한 수정 사항에 대한 언급이 없습니다. 연구.
업데이트 4-2013-02-13
Microsoft는 다음 업데이트에서이 버그에 대한 수정 프로그램을 출시했습니다.