【发布时间】:2013-11-25 23:50:54
【问题描述】:
我最近将我的项目从 EF5 升级到了 EF6。在这个项目中,我有一个定期运行的 Azure Worker Role,它在 SQL Azure 上启动一个存储过程,更新一堆数据库信息,平均需要 1.5 小时才能执行。完成后,辅助角色使用存储过程的返回结果执行附加任务。
这曾经在 EF5 中完美运行,但在 EF6 中每次都失败并出现以下错误之一:
错误 从服务器接收结果时发生传输级错误。 (提供者:Session Provider,错误:19 - 物理连接不可用)
错误会话已被终止,因为它获得了太多的锁。尝试在单个事务中读取或修改更少的行。当前命令发生严重错误。结果(如果有)应丢弃。
我尝试了以下方法来修复错误:
- 已验证所有存储过程读取都具有
WITH (NOLOCK)修饰符 - 将实体框架上下文的超时时间增加到 5 小时
- 删除了新的
SqlAzureExecutionStrategy并恢复使用DefaultExecutionStrategy - 删除了存储过程中发生的所有事务
- 确保辅助角色中的此步骤在其自己的上下文中运行
代码示例:
using (var dbContext = new EFEntityContext())
{
// set the timeout to 5 hours
var objectContext = (dbContext as IObjectContextAdapter).ObjectContext;
objectContext.CommandTimeout = 18000; // 5 hours
// update all active curriculums
var result = dbContext.usp_MyLongRunningProd();
// log the results of the operation
Trace.TraceInformation(result);
}
此外,存储过程将一个大表读入游标,循环遍历它,并根据每个项目执行分析和数据更改。我不需要光标处于任何类型的事务中,也没有使用我知道的,除非 EF 正在制作一个,这就是问题所在。
【问题讨论】:
标签: entity-framework azure-sql-database entity-framework-6