У меня есть запрос linq, выполняемый в веб-службе WCF, который ищет совпадение, а если он не найден, он создает его.LINQ Вставка в базу данных привела к дублированию
мой код выглядит
//ReadCommitted transaction
using (var ts = CreateTransactionScope(TransactionScopeOption.RequiresNew))
{
Contract contract = db.Contracts.SingleOrDefault(x => x.txtBlah == str);
if (contract == null)
{
contract = new Contract();
contract.txtBlah = str;
db.Contracts.InsertOnSubmit(contract);
db.SubmitChanges();
}
...
db.SubmitChanges();
}
Проблема заключается в том, что я получаю дубликаты. Я думал, что транзакция заблокировала бы базу данных, чтобы не было обнаружено дубликатов (и обеспечить возможность отката). Как я могу гарантировать, что дубликатов нет?
, который будет блокировать КАЖДОЙ вызов вокруг этой области. Могу ли я заблокировать только части вставки? aka блокировать сериализуемые транзакции внутри транзакции readcommitted? – BabelFish
aka Могу ли я получить BeginReadCommitTran {DoSomeFunctions; BeginSerializableTran {Insert; Commit; } DoMoreFunctions; Commit; } Если это имеет смысл – BabelFish
Поместите только выбор и вставку в Serializable tran или напишите sproc для него. – jomi