我编写了一个服务,每天运行一次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发生错误,至少不是到目前为止,但是它不会经常发生,因此很难建立任何模式。
我做错了什么?
答案 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]