EntityFramework SaveChanges由于“处理此事务的待处理请求”导致的间歇性异常

时间:2017-06-19 13:07:54

标签: c# entity-framework

我编写了一个服务,每天运行一次SchedulerCallback并使用EntityFramework 6.1.3,ApplicationUserManager和LINQ进行各种工作和更新MS SQL数据库

在每个任务之后,它使用SaveChanges在类中的全局上下文中保存更改,但是每隔几周就有一个或多个SaveChanges失败:“由于存在待处理的请求,因此无法执行事务操作处理此交易“。

调度程序如下所示:

Timer Scheduler = new Timer(new TimerCallback(SchedulerCallback))

所有的SaveChange都是在任何循环之后完成的,我无法在Entity Framework文档或Stack Overflow中发现我做错了什么。

我的服务类的一个简化示例,它忽略了调度并只执行了一个任务和SaveChanges:

public partial class MyService : ServiceBase
{
    private MyContext myContext { get; set; }
    private ApplicationUserManager UserManager { get; set; }

    public MyService()
    {
        MyContext = new MyContext();
        UserManager = new ApplicationUserManager(new UserStore<ApplicationUser>(MyContext));
    }

    private void SchedulerCallback()
    {
        var users = (from u in MyContext.Users where u.Status = StatusFlag.PlaceOrder select u.User).ToList();

        foreach (var user in users)
        {
            myContext.Order.Add(new MyOrder());
            myContext.Order.User = user;

            OrderTransaction transaction new OrderTransaction();
            order.Transactions = new List<OrderTransaction>();
            order.Transactions.Add(transaction);

            user.Status = StatusFlag.OrderPlaced;
        }

        try
        {
            myContext.SaveChanges();
        }
        catch (Exception e)
        {
            Logger.LogError("Exception", e);
        }
    }   
}

在我的服务中,SchedulerCallback做了很多事情并多次调用上下文中的SaveChanges(),但不是在循环中而是在各种任务中。这不是我第一次调用SaveChanges发生错误,至少不是到目前为止,但是它不会经常发生,因此很难建立任何模式。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

Timer的回调是在不同的线程(similar problem)中执行的,但是DbContext不是线程安全的,所以在做任何工作之前创建上下文:

   Options -Multiviews
   RewriteEngine On
   RewriteBase /site/public/
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule . index.php [L,QSA]