2009-09-15 6 views
1

TransactionScope를 사용하여 하나의 데이터베이스에 개체의 데이터를 추가하고 있습니다.관련 삽입이 transationscope에서 실패 함

의사 코드 :

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(); 
} 

내가 TableB의에서 ParentID이 TableA의에서 일치하는 기본 키 항목이없는 것을있는 오류와 InsertChildIntoTableB()에서 예외가.

연결이 다시 사용됩니다.

어떻게이 문제를 해결할 수 있습니까? TableA에서 SELECT WITH (NOLOCK)을 수행하면 새로 삽입 된 상위 레코드가 표시되지만 다음 하위 레코드 삽입에서는이를 볼 수 없습니다.

명확한 설명 편집 : foreach 루프에는 이미 삽입되었지만 커밋되지 않은 새 ParentID가 있습니다. 부모 TableA에 대한 TableB의 FK가 커밋되지 않은 새 TableA PK ID를 볼 수 없으므로 하위 TableB에 대한 삽입이 실패하는 것이 문제입니다.

답변

0

참고 - TransactionScope.Complete 인스턴스 메서드로 트랜잭션을 명시 적으로 완료해야합니다. 그렇지 않으면 롤백됩니다.

+0

예 - 좋은 관찰 – RichardOD

+0

나는 의사 코드로 남겨 두었습니다. 당신의보기 쾌락을 위해 조정. – callisto

+1

이것은 예상되는 해결책을 제공하지 않습니다. 이것은 받아 들여진 대답이되어서는 안됩니다. – LittleBit

0

ID 열이있는 경우 INSERT 문에 OUTPUT INSERTED 절을 사용할 수 있습니다.

여기에 a good article이 있습니다.

+0

내 수정을 확인하여 문제를 명확히하십시오. 당신이 제안하는 해결책은 내가 가지고있는 문제가 아닙니다. 자식 삽입이 실패 할 때 이미 newParentID를가집니다. – callisto