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();。若要应用其更改,事务必须等待其他更改应用程序结束。我想要的是能够让多个方法实例在不等待的情况下保存它们的更改。数据库集成只包括在数据库中的插入和删除(没有更新)。

EF6:同时进行多笔交易

您需要使用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();
}