Entity Framework Serializable Transaction Deadlock

voix
2

Je dois insérer une ligne dans la base de données, mais le problème est que la clé primaire est générée sur la base des comptes totaux de lignes. Par exemple, si le db a 25601 lignes, l'ID de l'enregistrement nouvellement inséré serait CT25602.

Je veux utiliser des transactions pour les collisions de clé primaire. Voici le code que j'ai écrit.

public void CreateContact(ContactViewModel input)
{
    var transactionScopeOptions = new TransactionOptions
    {
        IsolationLevel = IsolationLevel.Serializable,
        Timeout = TimeSpan.MaxValue
    };

    using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required, transactionScopeOptions))
    {
        var contactNo = GenerateIdentity();
        var contact = MapContactFields(new NavContact { No_ = contactNo }, input);

        _db.Contacts.InsertOnSubmit(contact);
        _db.SubmitChanges();
        transaction.Complete();
    }
}

Ce code me donne si deux personnes DEADLOCKS tentent d'insérer un contact dans un petit laps de temps.

Aucune suggestion ? Je vous remercie

Créé 19/11/2016 à 11:12
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Oui, le scénario que vous avez décrit est très probablement à une impasse. Je recommande d' utiliser une séquence à la place. Sinon, une solution consiste à acquérir un verrou d'application exclusive dans la transaction, avant scannig pour l'identité suivante. Voir sp_getapplock.

Créé 19/11/2016 à 11:20
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more