Помогите избавиться от deadlock'a

uaggster
Дата: 30.01.2013 21:10:46
Коллеги, помогите справиться с дедлоком!

Имеются 2 таблички:
/****** Object:  Table [dbo].[Journal]    Script Date: 01/30/2013 20:50:30 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Journal](
	[CntJournal] [int] IDENTITY(1,1) NOT NULL,
	[UserID] [nvarchar](255) NOT NULL,
	[ImportDate] [datetime] NOT NULL,
	[LPU_ID] [nvarchar](6) NOT NULL,
	[Invoice_Num] [nvarchar](10) NULL,
	[Invoice_Date] [smalldatetime] NULL,
	[Description] [nvarchar](1024) NULL,
	[IsDefect] [int] NULL,
	[State] [int] NULL,
 CONSTRAINT [PK_Journal] PRIMARY KEY CLUSTERED 
(
	[CntJournal] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = OFF, ALLOW_PAGE_LOCKS  = OFF, FILLFACTOR = 30) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Journal] ADD  CONSTRAINT [DF_Journal_ImportDate]  DEFAULT (getdate()) FOR [ImportDate]

/****** Object:  Table [dbo].[Files]    Script Date: 01/30/2013 20:51:16 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Files](
	[CntFile] [int] IDENTITY(1,1) NOT NULL,
	[CntJournal] [int] NOT NULL,
	[Comment] [nvarchar](254) NULL,
	[FileType] [nvarchar](10) NOT NULL,
	[XmlData] [xml] NOT NULL,
 CONSTRAINT [PK_Packade] PRIMARY KEY CLUSTERED 
(
	[CntFile] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = OFF, ALLOW_PAGE_LOCKS  = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Files]  WITH NOCHECK ADD  CONSTRAINT [FK_Files_Journal] FOREIGN KEY([CntJournal])
REFERENCES [dbo].[Journal] ([CntJournal])
ON UPDATE CASCADE
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[Files] CHECK CONSTRAINT [FK_Files_Journal]
GO

CREATE NONCLUSTERED INDEX [Force_FileType] ON [dbo].[Files] 
(
	[CntJournal] ASC,
	[FileType] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = OFF, ALLOW_PAGE_LOCKS  = OFF) ON [PRIMARY]
GO

CREATE PRIMARY XML INDEX [ix_XMLData] ON [dbo].[Files] 
(
	[XmlData]
)WITH (PAD_INDEX  = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ALLOW_ROW_LOCKS  = OFF, ALLOW_PAGE_LOCKS  = OFF, FILLFACTOR = 30)
GO


Имеется хранимая процедура:
/****** Object:  StoredProcedure [dbo].[ADD_Files2]    Script Date: 01/30/2013 20:52:31 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Добавляет xml файлы в таблицу files
-- =============================================
CREATE PROCEDURE [dbo].[ADD_Files2]
	@XmlDataL xml,					-- Содержимое файлов
	@XmlDataH xml					-- Содержимое файлов
AS
BEGIN
	SET NOCOUNT ON;
	Declare @CntJournal int;
	Declare @H int;
	Declare @L int;

BEGIN TRY
	Begin tran
		Insert into dbo.Journal 
			  (UserID, ImportDate, LPU_ID, Invoice_Num, 
			   Invoice_Date, [Description], IsDefect)
		Values (SYSTEM_USER, GETDATE(), '', Null,
			   Null, Null, Null)
		Set @CntJournal=SCOPE_IDENTITY()
		
		Insert into dbo.Files 
			  (CntJournal, FileType, XmlData)
		values (@CntJournal, 'L', @XmlDataL)
		Set @L=SCOPE_IDENTITY()

		Insert into dbo.Files 
			  (CntJournal, FileType, XmlData)
		Values (@CntJournal, 'H', @XmlDataH)
		Set @H=SCOPE_IDENTITY()
		
		--Exec dbo.ADD_PERS_LIST @L
		--Exec dbo.ADD_ZL_LIST @H
		Commit tran
		Return 0
	END TRY
	BEGIN CATCH
		rollback tran
		Return -1
	END CATCH


Сервер 2008R2. Уровень изоляции - снимок.
При массированном (да каком, нафиг, массированном! 4 потока всего) параллельном вызове хранимки - возникают дедлоки.

Один существенный момент - XML-файлы - большие. Точнее - разные. От 10 кБ до 100 Мб.

Хранимая процедура вызывается из приложения на VB.NET в несколько потоков. Причем для каждого потока создается отдельная SQLConnection.

При этом:
1. Возникают дедлоки
2. Уровень загрузки процессора на сервере всегда одинаков (около 13%) и не зависит от количества потоков.

Я чего то делаю не так. НО НЕ МОГУ ПОНЯТЬ - ЧЕГО!!!

Посоветуйте хоть чего-нибудь, а?
Crimean
Дата: 30.01.2013 21:29:35
профайлером граф дедлока снимите и покажите для начала
Ennor Tiegael
Дата: 30.01.2013 21:31:09
1. print @@version
2. Граф дэдлока покажете? Иначе разговор довольно беспредметен.

Но навскидку, для начала вам стоит объединить два инсерта в dbo.Files в один.
Crimean
Дата: 30.01.2013 21:41:04
Ennor Tiegael,

а сами по себе xml индексы потенциально не дедлочные?
uaggster
Дата: 30.01.2013 22:05:30
Crimean,
Вот, примерно так?

2013-01-30 21:55:00.48 spid7s Deadlock encountered .... Printing deadlock information
2013-01-30 21:55:00.48 spid7s Wait-for graph
2013-01-30 21:55:00.48 spid7s
2013-01-30 21:55:00.48 spid7s Node:1

2013-01-30 21:55:00.48 spid7s OBJECT: 15:2121058592:0 CleanCnt:4 Mode:IX Flags: 0x1
2013-01-30 21:55:00.48 spid7s Grant List 0:
2013-01-30 21:55:00.48 spid7s Grant List 3:
2013-01-30 21:55:00.48 spid7s Owner:0x00000000802992C0 Mode: IX Flg:0x40 Ref:1 Life:02000000 SPID:53 ECID:0 XactLockInfo: 0x00000000CBCB4EC0
2013-01-30 21:55:00.48 spid7s SPID: 53 ECID: 0 Statement Type: INSERT Line #: 16
2013-01-30 21:55:00.48 spid7s Input Buf: RPC Event: Proc [Database Id = 15 Object Id = 1093578934]
2013-01-30 21:55:00.48 spid7s Requested by:
2013-01-30 21:55:00.48 spid7s ResType:LockOwner Stype:'OR'Xdes:0x000000013CB6EE80 Mode: X SPID:62 BatchID:0 ECID:0 TaskProxy:(0x000000013C452540) Value:0x80297940 Cost:(0/0)
2013-01-30 21:55:00.48 spid7s
2013-01-30 21:55:00.48 spid7s Node:2

2013-01-30 21:55:00.48 spid7s OBJECT: 15:2121058592:0 CleanCnt:4 Mode:IX Flags: 0x1
2013-01-30 21:55:00.48 spid7s Grant List 0:
2013-01-30 21:55:00.48 spid7s Grant List 3:
2013-01-30 21:55:00.48 spid7s Owner:0x000000008029A680 Mode: IX Flg:0x40 Ref:1 Life:02000000 SPID:62 ECID:0 XactLockInfo: 0x000000013CB6EEC0
2013-01-30 21:55:00.48 spid7s SPID: 62 ECID: 0 Statement Type: INSERT Line #: 16
2013-01-30 21:55:00.48 spid7s Input Buf: RPC Event: Proc [Database Id = 15 Object Id = 1093578934]
2013-01-30 21:55:00.48 spid7s Requested by:
2013-01-30 21:55:00.48 spid7s ResType:LockOwner Stype:'OR'Xdes:0x00000000CBCB4E80 Mode: X SPID:53 BatchID:0 ECID:0 TaskProxy:(0x000000008D150540) Value:0x80297540 Cost:(0/0)
2013-01-30 21:55:00.48 spid7s
2013-01-30 21:55:00.48 spid7s Node:3

2013-01-30 21:55:00.48 spid7s OBJECT: 15:2121058592:0 CleanCnt:4 Mode:IX Flags: 0x1
2013-01-30 21:55:00.48 spid7s Grant List 0:
2013-01-30 21:55:00.48 spid7s Grant List 3:
2013-01-30 21:55:00.48 spid7s Owner:0x00000000802992C0 Mode: IX Flg:0x40 Ref:1 Life:02000000 SPID:53 ECID:0 XactLockInfo: 0x00000000CBCB4EC0
2013-01-30 21:55:00.48 spid7s Requested by:
2013-01-30 21:55:00.48 spid7s ResType:LockOwner Stype:'OR'Xdes:0x000000008088C3B0 Mode: X SPID:63 BatchID:0 ECID:0 TaskProxy:(0x000000014355A540) Value:0x801e4fc0 Cost:(0/0)
2013-01-30 21:55:00.49 spid7s
2013-01-30 21:55:00.49 spid7s Victim Resource Owner:
2013-01-30 21:55:00.49 spid7s ResType:LockOwner Stype:'OR'Xdes:0x000000013CB6EE80 Mode: X SPID:62 BatchID:0 ECID:0 TaskProxy:(0x000000013C452540) Value:0x80297940 Cost:(0/0)
2013-01-30 21:55:00.49 spid7s
2013-01-30 21:55:00.49 spid7s Victim Resource Owner:
2013-01-30 21:55:00.49 spid7s ResType:LockOwner Stype:'OR'Xdes:0x00000000CBCB4E80 Mode: X SPID:53 BatchID:0 ECID:0 TaskProxy:(0x000000008D150540) Value:0x80297540 Cost:(0/0)
uaggster
Дата: 30.01.2013 22:07:40
Ennor Tiegael,

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2550.0 (X64)
Jun 11 2012 16:41:53
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
Crimean
Дата: 30.01.2013 22:22:31
uaggster,

профайлером же. а не с лога. а то тут надо все ресурсы резолвить для начала. да и привычнее уже по графу из профайлера работать
uaggster
Дата: 30.01.2013 22:41:09
Crimean,
Гм... а его как вставить?

См. приложение?
uaggster
Дата: 30.01.2013 22:47:20
<deadlock-list>
 <deadlock victim="process51cd048">
  <process-list>
   <process id="process40ad048" taskpriority="0" logused="0" waitresource="OBJECT: 15:2121058592:0 " waittime="1081" ownerId="1452593" transactionname="user_transaction" lasttranstarted="2013-01-30T21:56:54.783" XDES="0xc57c5950" lockMode="X" schedulerid="3" kpid="4448" status="suspended" spid="59" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2013-01-30T21:56:54.783" lastbatchcompleted="2013-01-30T21:56:49.050" clientapp=".Net SqlClient Data Provider" hostname="W01-3000-1001" hostpid="7928" loginname="SOGAZ-MED\Skoblevad" isolationlevel="read committed (2)" xactid="1452593" currentdb="15" lockTimeout="4294967295" clientoption1="673185824" clientoption2="128056">
    <executionStack>
     <frame procname="reestrsx3.dbo.ADD_Files2" line="16" stmtstart="760" stmtend="1144" sqlhandle="0x03000f00b6b02e41d089550156a100000100000000000000">
Insert into dbo.Journal 
			  (UserID, ImportDate, LPU_ID, Invoice_Num, 
			   Invoice_Date, [Description], IsDefect)
		Values (SYSTEM_USER, GETDATE(), &apos;&apos;, Null,
			   Null, Null, Null)     </frame>
    </executionStack>
    <inputbuf>
Proc [Database Id = 15 Object Id = 1093578934]    </inputbuf>
   </process>
   <process id="process51cd048" taskpriority="0" logused="0" waitresource="OBJECT: 15:2121058592:0 " waittime="1081" ownerId="1449909" transactionname="user_transaction" lasttranstarted="2013-01-30T21:56:51.483" XDES="0x13cb6ee80" lockMode="X" schedulerid="8" kpid="4560" status="suspended" spid="62" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2013-01-30T21:56:51.480" lastbatchcompleted="2013-01-30T21:56:47.470" clientapp=".Net SqlClient Data Provider" hostname="W01-3000-1001" hostpid="7928" loginname="SOGAZ-MED\Skoblevad" isolationlevel="read committed (2)" xactid="1449909" currentdb="15" lockTimeout="4294967295" clientoption1="673185824" clientoption2="128056">
    <executionStack>
     <frame procname="reestrsx3.dbo.ADD_Files2" line="16" stmtstart="760" stmtend="1144" sqlhandle="0x03000f00b6b02e41d089550156a100000100000000000000">
Insert into dbo.Journal 
			  (UserID, ImportDate, LPU_ID, Invoice_Num, 
			   Invoice_Date, [Description], IsDefect)
		Values (SYSTEM_USER, GETDATE(), &apos;&apos;, Null,
			   Null, Null, Null)     </frame>
    </executionStack>
    <inputbuf>
Proc [Database Id = 15 Object Id = 1093578934]    </inputbuf>
   </process>
   <process id="process4093288" taskpriority="0" logused="0" waitresource="OBJECT: 15:2121058592:0 " waittime="1081" ownerId="1455045" transactionname="user_transaction" lasttranstarted="2013-01-30T21:56:57.937" XDES="0x15b811950" lockMode="X" schedulerid="2" kpid="6116" status="suspended" spid="63" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2013-01-30T21:56:57.937" lastbatchcompleted="2013-01-30T21:56:53.473" clientapp=".Net SqlClient Data Provider" hostname="W01-3000-1001" hostpid="7928" loginname="SOGAZ-MED\Skoblevad" isolationlevel="read committed (2)" xactid="1455045" currentdb="15" lockTimeout="4294967295" clientoption1="673185824" clientoption2="128056">
    <executionStack>
     <frame procname="reestrsx3.dbo.ADD_Files2" line="16" stmtstart="760" stmtend="1144" sqlhandle="0x03000f00b6b02e41d089550156a100000100000000000000">
Insert into dbo.Journal 
			  (UserID, ImportDate, LPU_ID, Invoice_Num, 
			   Invoice_Date, [Description], IsDefect)
		Values (SYSTEM_USER, GETDATE(), &apos;&apos;, Null,
			   Null, Null, Null)     </frame>
    </executionStack>
    <inputbuf>
Proc [Database Id = 15 Object Id = 1093578934]    </inputbuf>
   </process>
  </process-list>
  <resource-list>
   <objectlock lockPartition="0" objid="2121058592" subresource="FULL" dbid="15" objectname="reestrsx3.dbo.Journal" id="lock8020cd80" mode="IX" associatedObjectId="2121058592">
    <owner-list>
     <owner id="process51cd048" mode="IX"/>
    </owner-list>
    <waiter-list>
     <waiter id="process40ad048" mode="X" requestType="convert"/>
    </waiter-list>
   </objectlock>
   <objectlock lockPartition="0" objid="2121058592" subresource="FULL" dbid="15" objectname="reestrsx3.dbo.Journal" id="lock8020cd80" mode="IX" associatedObjectId="2121058592">
    <owner-list>
     <owner id="process40ad048" mode="IX"/>
    </owner-list>
    <waiter-list>
     <waiter id="process51cd048" mode="X" requestType="convert"/>
    </waiter-list>
   </objectlock>
   <objectlock lockPartition="0" objid="2121058592" subresource="FULL" dbid="15" objectname="reestrsx3.dbo.Journal" id="lock8020cd80" mode="IX" associatedObjectId="2121058592">
    <owner-list>
     <owner id="process51cd048" mode="IX"/>
    </owner-list>
    <waiter-list>
     <waiter id="process4093288" mode="X" requestType="convert"/>
    </waiter-list>
   </objectlock>
  </resource-list>
 </deadlock>
</deadlock-list>
	
RESEARCH
Дата: 30.01.2013 23:19:14
не попробовать ли перенести

begin tran перед begin try