I have a linq query running in a WCF Web Service that looks for a match and if one is not found then it creates one.
my code looks like
   //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();
   }
The problem is that I am getting duplicates. I thought the transaction would have locked the database to ensure no duplicates would be found (and supply the ability to rollback). How can I ensure that there are no duplicates?