我必须在数据库中插入一行,但问题是主键是根据行的总计数生成的。 例如。如果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();
}
}
如果两个人试图在很短的时间内插入一个联系人,这段代码就会给我带来死锁。
有什么建议吗?谢谢
答案 0 :(得分:0)
是的,您描述的场景很可能会陷入僵局。我建议改用sequence。如果没有,那么一个解决方案是在事务中获取独占应用锁,在扫描之前以获取下一个身份。请参阅sp_getapplock
。