J'ai une requête linq en cours d'exécution dans un service Web WCF qui recherche une correspondance et si elle n'est pas trouvée, elle en crée une.LINQ Insérer dans la base de données a entraîné des doublons
mon code ressemble
//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();
}
Le problème est que je reçois des doublons. Je pensais que la transaction aurait verrouillé la base de données pour s'assurer qu'aucun doublon ne serait trouvé (et fournir la possibilité de revenir en arrière). Comment puis-je m'assurer qu'il n'y a pas de doublons?
qui va bloquer tous les appels autour de cette zone .. puis-je verrouiller uniquement sur les parties d'insertion? alias bloquer les transactions sérialisables à l'intérieur de la transaction readcommitted? – BabelFish
aka peut-on avoir BeginReadCommitTran {DoSomeFunctions; BeginSerializableTran {Insérer; Commettre; } DoMoreFunctions; Commettre; } Si cela a du sens – BabelFish
Ne placez que le select et l'insert dans un tran Serializable ou écrivez-en un sproc. – jomi