필자는 본질적으로 ETL 작업을 수행하는 linq-to-sql 프로그램을 작성했으며 병렬 처리가 성능을 향상시키는 곳이 많다는 것을 알고 있습니다. 그러나, 두 스레드가 다음 작업 (psuedo 코드)을 수행 할 때 uniquness 제약 조건 위반을 방지하는 데 관심이 있습니다. 일반적다음 삽입 삽입하지 않는 트랜잭션에 어떤 격리 수준을 사용해야합니까?
Record CreateRecord(string recordText)
{
using (MyDataContext database = GetDatabase())
{
Record existingRecord = database.MyTable.FirstOrDefault(record.KeyPredicate());
if(existingRecord == null)
{
existingRecord = CreateRecord(recordText);
database.MyTable.InsertOnSubmit(existingRecord);
}
database.SubmitChanges();
return existingRecord;
}
}
이 코드는 기록이 존재하지 않는 경우 INSERT
문장 뒤에 기록 실존 테스트하는 SELECT
명령문을 실행한다. 암시 적 트랜잭션에 의해 캡슐화됩니다.
두 스레드가 recordText
의 동일한 인스턴스에 대해이 코드를 실행하면 두 레코드가 동일한 레코드를 만들려고 시도하면서 레코드가 존재하지 않는다고 동시에 판단하지 못하도록하고 싶습니다. 격리 수준과 명시 적 트랜잭션은 잘 작동 할 것입니다. 제외 수준을 사용해야하는지 확신 할 수 없다면 (Serializable
) 작동해야하지만 너무 엄격한 것 같습니다. 더 나은 선택이 있습니까?