1

哪个 Transaction IsolationLevel 最能保证只创建 1 个 Datarow。假设使用 SQL Server 2012 和 EntityFramework 6。

    using(var db = new XyzContext())
    {
        using(var dbContextTransaction = db.Database.BeginTransaction(???))
        {
            try
            {

                Item obj = db.Item.SingleOrDefault(o => o.Hashcode.Equals(hashCode));

//it is possible that 2 threads are coming through here and both have obj == null

                if(obj == null)
                {
                    obj = db.Item.Add(new Item
                    {
                        Hashcode = hashCode,
                        State = 0,

                    });
                }

                db.SaveChanges();

                dbContextTransaction.Commit();
            }
            catch(Exception)
            {
                dbContextTransaction.Rollback();
            }
        }
    }
4

1 回答 1

1

如果您的方案是更新的,那么快照很好,(这是 ef 6 的默认行为)。

但是在您的插入情况下,大多数方法都无法正常工作。

您必须确保您的锁升级级别是表(默认)。然后应用RepeatableRead事务模式。它阻止其他线程读取表,直到第一个线程完成。

最好在其中一个列上使用唯一约束列而不是这种方法。

或者在你的 sql server 数据库中创建一个特殊的表,然后在你的主查询和插入之前对该表的特定记录进行行锁定,然后做你的工作,你对该表的其他操作没有瓶颈并且足够快。

祝你好运

于 2013-11-20T15:13:05.573 回答