交易失败

时间:2018-02-07 14:49:01

标签: c# .net sql-server entity-framework

我有一些方法:

public SaveMyData(...)
{
    var transactionOptions = new TransactionOptions { IsolationLevel = IsolationLevel.Snapshot };
            using (var transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
            {
                var dataInDb = dbDataService.LoadData();

                dataInDb.SomeField = someNewValue;

                dbDataService.SaveData(dataInDb);

                transactionScope.Complete();             
            }
}

因此它从数据库中获取字符串序列化Dto并更改字段。比保存它。

SaveMyData可以在同一时间从不同的线程调用,所以我得到错误:

  

您不能使用快照隔离来访问表'some table'   直接或间接在数据库'some db'中更新,删除或   插入已被其他人修改或删除的行   交易。重试事务或更改隔离级别   更新/删除声明

如何避免此错误?我需要使用不同的隔离级别吗?

SaveData()内部方法中,我创建新的EF上下文并保存更改。

我想让它发挥作用的方式是: CallerA调用SaveMyData,它会锁定,如果CallerB同时调用它,他将等待直到CallerA提交。所以我需要在CallerB写更改之前不允许CallerA读取数据。

0 个答案:

没有答案