2016-11-19 114 views
2

我必須在數據庫中插入一行,但問題是主鍵是根據行的總數生成的。 例如如果數據庫有25601行,則新插入的記錄的ID將爲CT25602。實體框架可串行化事務死鎖

我想使用事務處理主鍵衝突。 這是我寫的代碼。

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秒內執行相同的操作? –