1

オブジェクトのデータを 1 つのデータベースに追加するために TransactionScope を使用しています。

擬似コード:

using (TransactionScope trx = new TransactionScope())
{
   SqlConnection con = DL.GetNewConn();
   int newParentRecordID = InsertParentIntoTableA(object parent, con);

   foreach(obj child in parent.childrenObjects)
   {
       child.ParentID = newParentRecordID ;
       int newChildRecordID =  InsertChildIntoTableB(object child, con);
   }
   trx.Complete();
}

InsertChildIntoTableB() で例外が発生し、TableB の ParentID に TableA に一致する主キー エントリがないというエラーが表示されます。

接続は再利用されます。

どうすればこれを回避できますか? TableA で SELECT WITH (NOLOCK) を実行すると、新しく挿入された親レコードが表示されますが、次の子レコードの挿入では表示されません。

明確にするために編集:foreachループでは、すでに挿入されていますが、コミットされていない新しいParentIDがあります。問題は、親 TableA の TableB の FK がコミットされていない新しい TableA PK ID を認識できないため、子の TableB への挿入が失敗することです。

4

2 に答える 2

0

ID 列がある場合は、INSERT ステートメントでOUTPUT INSERTED句を使用してみてください。

これについては、良い記事があります。

于 2009-09-15T11:20:25.747 に答える
0

補足 - TransactionScope.Complete インスタンス メソッドを使用してトランザクションを明示的に完了する必要があります。そうしないと、ロールバックされます。

于 2009-09-15T11:22:43.180 に答える