EF6:同时进行多笔交易
本文关键字:交易 EF6 | 更新日期: 2023-09-27 18:27:47
我的项目有两个部分:一个是收集一些数据的Powershell脚本,另一个是接收数据(作为文件)并将其集成到数据库中的ASP.NET 4.5 MVC应用程序(带有Entity Framework 6.1.3)。大约有1500个文件将被发送到ASP.NET应用程序。
我需要使用事务:如果在将数据添加到DB时发生错误,则不必添加任何内容(回滚)。添加此函数不是问题。但当一个事务开始时,另一个事务似乎要等到第一个事务被提交或回滚后才能开始。这很糟糕,因为我的1500个文件必须一个接一个地等待才能添加,而且由于集成时间为+/-5分钟,所以需要太多时间。
我不知道我在哪里犯了错误。以下是我的代码:
public bool JsonToDB(dynamic data)
{
using (MyEntities context = new MyEntities())
{
context.Database.CommandTimeout = 300;
context.Configuration.AutoDetectChangesEnabled = false;
context.Configuration.ValidateOnSaveEnabled = false;
using (var transaction = context.Database.BeginTransaction(IsolationLevel.ReadUncommitted))
{
try
{
// DB integration from the file provided by the Powershell script.
context.SaveChanges();
transaction.Commit();
transaction.Dispose();
return true;
}
catch (Exception e)
{
// Error management.
transaction.Rollback();
transaction.Dispose();
return false;
}
}
}
}
public Task FileIntegration(string fileDirectory, string fileName)
{
return Task.Factory.StartNew(() =>
{
try
{
string fileContent = System.IO.File.ReadAllText(fileDirectory + "JSON/" + fileName, Encoding.ASCII);
var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new DynamicJsonConverter() });
dynamic data = serializer.Deserialize(fileContent, typeof(object));
if (JsonToDB(data))
{
System.IO.Directory.Move(fileDirectory + "JSON/" + fileName, fileDirectory + "JSON/Success/" + fileName);
}
else
{
System.IO.Directory.Move(fileDirectory + "JSON/" + fileName, fileDirectory + "JSON/Error/" + fileName);
}
}
catch(Exception e)
{
System.IO.Directory.Move(fileDirectory + "JSON/" + fileName, fileDirectory + "JSON/Error/" + fileName);
}
});
}
[HttpPost]
[AllowAnonymous]
public ActionResult Receive(HttpPostedFileWrapper file)
{
try
{
file.SaveAs(Server.MapPath("~") + "/Files/JSON/" + file.FileName);
HostingEnvironment.QueueBackgroundWorkItem(ct => {
return FileIntegration(Server.MapPath("~") + "/Files/", file.FileName);
});
}
catch (Exception e)
{
return new HttpStatusCodeResult(400, "Unable to save the JSON file. Detailed error: " + e.Message);
}
return new HttpStatusCodeResult(200, "OK");
}
我还尝试使用SaveChangesAsync方法来保存更改(https://stackoverflow.com/a/28133913)但是出现了一个错误:
提交数据库事务时报告了一个错误,但无法确定该事务在数据库服务器上是成功还是失败。
你有什么想法可以帮我解决这个问题吗?
提前谢谢。
编辑:更清楚地说:它是不能同时对多个事务执行的指令context.SaveChanges();
。若要应用其更改,事务必须等待其他更改应用程序结束。我想要的是能够让多个方法实例在不等待的情况下保存它们的更改。数据库集成只包括在数据库中的插入和删除(没有更新)。
您需要使用TransactionScope
类。以下是的示例
using (TransactionScope scope = new TransactionScope())
{
//Do something with context1
//Do something with context2
//Save and discard changes
context1.SaveChanges();
//Save and discard changes
context2.SaveChanges();
//if we get here things are looking good.
scope.Complete();
}