인 C# 트랜잭션 범위 나의 요구 사항은 백만 개의 레코드가있는 여러 비용 파일을 처리하는 것입니다. 처리 및 유효성 검사를 마친 후 해당 레코드를 데이터베이스에 추가해야합니다.수익률이
더 나은 성능을 위해 foreach 루프에서 "yield
"을 사용하고 한 번에 하나의 레코드를 반환하고 해당 레코드를 처리 한 다음 해당 레코드 하나를 파일 번호가있는 데이터베이스에 즉시 추가하십시오. 이 파일을 읽는 동안 모든 데이터 유효성 검사 오류가 발생하면 InvalidRecordException이 발생합니다.
내 요구 사항은 해당 파일과 관련된 테이블에서 모든 레코드를 삭제하는 것입니다. 즉, 하나의 레코드가 유효하지 않더라도 해당 파일을 잘못된 파일로 표시하고 해당 파일의 레코드 하나를 데이터베이스에 추가하지 않겠습니다.
누구나 나를 도울 수 있습니다. 여기서 어떻게 TransactionScope를 사용할 수 있습니까?
public class CostFiles
{
public IEnumerable<string> FinancialRecords
{
get
{
//logic to get list of DataRecords
foreach (var dataRecord in DataRecords)
{
//some processing... which can throw InvalidRecord exception
yield return dataRecord;
}
yield break;
}
}
}
public void ProcessFileRecords(CostFiles costFile, int ImportFileNumber)
{
Database db = new Database();
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
try
{
foreach (var record in costFile.FinancialRecords)
{
db.Add(record, ImportFileNumber);
}
}
catch(InvalidRecordException ex)
{
//here i want to delete all the records from the table where import file number is same as input paramter ImportFileNumber
}
}
}
'데이터베이스'란 무엇입니까? TransactionScope은 (일반적으로) 분산 트랜잭션 지원에 사용됩니다. 'Database'는 이것을 지원합니까? 네이티브 거래 개념을 사용할 수 있습니까? –
데이터 작업을 처리하기 위해 저장 프로 시저를 사용하는 것이 좋습니다. 행을 고민하여이 행을 수행하는 것은 수백만 행으로 끔찍하게 느려질 것입니다. –
@DavidOsborne'TransactionScope'는 "일반적으로 분산 트랜잭션 지원에 사용되지 않습니다." TransactionScope는 동일한 SQL 연결 개체를 다시 사용하지 않으면 트랜잭션을 분산 트랜잭션으로만 승격합니다. – DVK