2016-11-19 4 views
2

データベースに行を挿入する必要がありますが、問題は、行の合計数に基づいて主キーが生成されることです。 など。 dbに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(); 
    } 
} 

このコードは、2人の人が小さいタイムスパンに連絡先を挿入しようとするとデッドロックが発生します。

提案がありますか?ありがとうございます

答えて

0

はい、説明したシナリオは、デッドロックの可能性が非常に高いです。代わりにsequenceを使用することをおすすめします。そうでない場合、1つの解決策は、の前に scannigの次の身分証明書の前に、排他的なアプリケーションロックを取得することです。 sp_getapplockを参照してください。

+0

x秒間に同じ操作を実行する再試行のような、ある種の「遅延」メカニズムを使用できませんでしたか? –

関連する問題