实体框架可序列化事务死锁

时间:2016-11-19 11:12:45

标签: sql sql-server linq-to-sql

我必须在数据库中插入一行,但问题是主键是根据行的总计数生成的。 例如。如果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();
    }
}

如果两个人试图在很短的时间内插入一个联系人,这段代码就会给我带来死锁。

有什么建议吗?谢谢

1 个答案:

答案 0 :(得分:0)

是的,您描述的场景很可能会陷入僵局。我建议改用sequence。如果没有,那么一个解决方案是在事务中获取独占应用锁,在扫描之前以获取下一个身份。请参阅sp_getapplock