オブジェクトのデータを 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 への挿入が失敗することです。