我有一些方法:
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
读取数据。