我有这个案子。 FileController中的My Web Api方法同时由多个用户加入,其中一些尝试同时插入相同的记录。我已检查"如果记录存在则返回错误",但由于同时访问该方法,因此上下文尚未更新,因此该记录不存在于数据库并由两个/多个线程插入。
[HttpPost]
[Route("api/Files/Import")]
public HttpResponseMessage Import(ImportFileRequest request)
{
using (var transactionMgr = managerTransactions.BeginTransaction()) //here BeginTransaction returns context.Database.BeginTransaction()
{
if(!managerTransactions.FilesRepository.FileExists(request.FileName))
{
File file = new File();
file.Name = request.FileName;
//other properties
managerTransactions.FilesRepository.Add(file);
managerTransactions.SaveCahnges();
transactionMgr.Commit();
}
else
{
throw new Exception("File exists");
}
}
}
因此,在Save方法之前,两个线程已经进入方法并添加了文件。在第一个线程上执行save之前,第二个线程被占用,并且两个记录被添加到上下文中。然后执行保存并在数据库中添加两个文件。我无法使用TransactionScope,因为我们的客户不想安装必须安装的此服务。我尝试使用锁定对象,它似乎工作,但我不知道这是一个好主意