Я сталкиваюсь с проблемой взаимоблокировки, когда моя хранимая процедура вызывается в sql server 2008. Строка xml передается в хранимую процедуру biztalk и может быть вызвана много раз подряд.Проблема, с которой я сталкиваюсь, заключается в том, что если процедура вызывается 5 раз подряд, первые 4 вызова откатываются, и последний вызов фиксируется в базе данных из-за тупика.Ниже приведен код процедуры - он использует OPENXML для анализа строки xml и вставки в таблицу A. Затем я беру новый уникальный идентификатор из таблицы A и вставляю несколько дочерних записей в таблицу B. Любое руководство по решению этой проблемы будетприветствуем.
Сообщение об ошибке: System.Data.SqlClient.SqlException (0x80131904): Транзакция (идентификатор процесса XX) заблокирована для ресурсов блокировки с другим процессом и была выбрана в качествежертва тупика.Перезапустите транзакцию.
Подробности таблицы TableA- Id int identity (1,1) Первичный ключ,- Столбец А varchar (15) не нулевой,- ColumnB varchar (20) не нуль,- AddedDateTime datetime по умолчанию (getdate ())
Таблица B- Id int identity (1,1) Первичный ключ,- TableAId int не null, (FK)- ColumnC varchar (30) не является нулевым
XML
<Transactions>
<Transaction>
<ColumnA>Column A Value</ColumnA>
<ColumnB>Column B Value</ColumnB>
<ChildItems>
<ChildItem>
<ColumnC>Column C Value</ColumnC>
</ChildItem>
<ChildItem>
<ColumnC>Another Column C Value</ColumnC>
</ChildItem>
<ChildItem>
<ColumnC>Yet Another Column C Value</ColumnC>
</ChildItem>
</ChildItems>
Хранимая процедура
CREATE PROCEDURE [dbo].[proc_ProcessXml]
(
@ResponseXml varchar(max)
)
WITH EXECUTE AS CALLER
AS
BEGIN TRANSACTION
DECLARE @xmlHandle int
declare @tableAId int
EXEC sp_xml_preparedocument @xmlHandle OUTPUT, @ResponseXml,
INSERT INTO TableA
(
ColumnA,
ColumnB
)
SELECT columnA, columnB
FROM OPENXML(@xmlHandle, '/Transactions/Transaction', 1)
WITH(
columnA varchar(15) 'ColumnA',
columnB varchar(20) 'ColumnB'
)
select @tableAId = SCOPE_IDENTITY()
INSERT INTO TableB
(
TableAId,
ColumnC
)
SELECT @tableAId, columnC
FROM OPENXML(@xmlHandle, '/Transactions/Transaction/ChildItems/ChildItem', 1)
WITH(
columnC varchar(30) 'ColumnC',
)
EXEC sp_xml_removedocument @xmlHandle
IF @@ERROR <> 0
BEGIN
ROLLBACK
END
ELSE
BEGIN
COMMIT
END