如果先前的操作超时,则EF等待更新将引发不支持的MultipleActiveResultSets异常

时间:2019-02-20 09:18:36

标签: c# multithreading entity-framework async-await

我有以下逻辑:

public async Task UpdateData(DbContext context)
{
    try
    {
        await LongUpdate(context);
    }
    catch (Exception e)
    {
        try
        {
            await context.Database.ExecuteSqlCommandAsync($@"update d set d.UpdatedAt = GETDATE() from SomeTable d where id > 11");
        }
        catch (Exception ex)
        {
            throw;
        }
    }
}
// this operations takes about 1 minute
private static async Task<int> LongUpdate(DbContext context)
{
    context.Database.CommandTimeout = 5; // change this to 15 to see MultipleActiveResultSets exception
    return await context.Database.SqlQuery<int>($@"update otherTable set UpdatedAt = GETDATE();SELECT @@ROWCOUNT").FirstOrDefaultAsync();
}

如上所述,有两个更新操作都在等待。 LongUpdate需要超过一分钟的时间。

当超时设置为5s时: LongUpdate抛出超时异常,第二次更新成功执行。

当我将超时时间增加到15秒或更长时间时: LongUpdate引发超时异常,但第二次更新立即引发: System.InvalidOperationException:该连接不支持MultipleActiveResultSets。

是否正在等待阻止此异常? 为什么这取决于超时值?

0 个答案:

没有答案