SQL Server 2008 でストアド プロシージャを呼び出すと、デッドロックの問題が発生します。xml 文字列は、biztalk によってストアド プロシージャに渡され、立て続けに何度も呼び出すことができます。私が直面している問題は、プロシージャが立て続けに 5 回呼び出されると、最初の 4 回の呼び出しがロールバックされ、デッドロックのために最後の呼び出しがデータベースにコミットされることです。以下は手順のコードです。OPENXML を使用して xml 文字列を解析し、テーブル A に挿入します。次に、テーブル A から新しい一意の識別子を取得し、複数の子レコードをテーブル B に挿入します。この問題を解決する方法に関するガイダンスは、感謝します。
エラー メッセージ: System.Data.SqlClient.SqlException (0x80131904): トランザクション (プロセス ID XX) は別のプロセスのロック リソースでデッドロックされ、デッドロックの犠牲者として選択されました。トランザクションを再実行します。
テーブルの詳細
TableA
- Id int identity(1,1) Primary Key,
- ColumnA varchar(15) not null,
- ColumnB varchar(20) not null,
- addedDateTime datetime default(getdate())
TableB
- Id int identity(1,1) Primary Key,
- TableAId int not null, (FK)
- ColumnC varchar(30) not null
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