我已經寫了一個基本上執行ETL任務的linq-to-sql程序,並且我注意到許多並行化將提高其性能的地方。但是,我擔心在兩個線程執行以下任務(僞代碼)時防止出現唯一性約束違規。對於以下insert-if-present事務,我應該使用哪種隔離級別?
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;
}
}
一般情況下,該代碼執行SELECT
語句來測試記錄所有腦幹,接着是INSERT
聲明如果記錄不存在。它被隱式事務封裝。
當兩個線程爲recordText
的同一個實例運行此代碼時,我想阻止它們同時確定該記錄不存在,從而同時嘗試創建相同的記錄。隔離級別和顯式事務將運行良好,除非我不確定我應該使用哪個隔離級別 - Serializable
應該可以工作,但似乎太嚴格了。有更好的選擇嗎?