Коллеги, помогите справиться с дедлоком!
Имеются 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%) и не зависит от количества потоков.
Я чего то делаю не так. НО НЕ МОГУ ПОНЯТЬ - ЧЕГО!!!
Посоветуйте хоть чего-нибудь, а?