2016-11-19 3 views
2

Мне нужно вставить строку в базу данных, но проблема в том, что первичный ключ создается на основе общего количества строк. . если db имеет 25601 строк, идентификатором вновь вставленной записи будет CT25602.Entity Framework Serializable Transaction Deadlock

Я хочу использовать транзакции для коллизий первичных ключей. Вот код, который я написал.

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(); 
    } 
} 

Этот код дает мне взаимоблокировки, если два человека пытаются вставить контакт в небольшой промежуток времени.

Любые предложения? Спасибо

ответ

0

Да, сценарий, который вы описали, очень вероятен в тупике. Я бы рекомендовал вместо этого использовать sequence. Если нет, то одним из решений является приобретение эксклюзивной блокировки приложения в транзакции, до scannig для следующего удостоверения. См. sp_getapplock.

+0

Не мог ли я использовать какой-либо механизм «отсрочки», например, повтор, выполняющий одну и ту же операцию за x секунд? –

 Смежные вопросы

  • Нет связанных вопросов^_^