Установить PENDING блокировку на EF core SqlLite - PullRequest
0 голосов
/ 05 декабря 2018

Я занимаюсь разработкой приложения ASP .Net Core Web-api с EF Core и SqlLite.Если запросов на выборку много, запросы на обновление работают очень медленно.Когда количество запросов растет, я получаю ошибку «база данных заблокирована».Я думаю, что проблема заключается в «голодании писателя», поэтому я хочу установить блокировку PENDING для своих обновлений, когда DBContext сохраняет данные в БД.

Как установить блокировку PENDING с помощью ядра EF?Есть ли какое-либо другое решение?

UPD:

  1. иногда блокируется база данных, даже если не так много запросов

  2. пакеты:

    <PackageReference Include="Abp.AspNetCore.OData" Version="3.8.2" /> 
    <PackageReference Include="Abp.AspNetCore.SignalR" Version="3.7.2" />
    <PackageReference Include="Abp.AspNetCore" Version="3.8.2" />
    <PackageReference Include="jquery.datatables" Version="1.10.15" />
    <PackageReference Include="MailKit" Version="2.0.7" />
    <PackageReference Include="Microsoft.AspNetCore.OData" Version="7.0.1" />        
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.1.3" />
    <PackageReference Include="BuildBundlerMinifier" Version="2.8.391" />    
    <PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />
    <PackageReference Include="Microsoft.Win32.Registry" Version="4.5.0" />
    <PackageReference Include="NLog.MailKit" Version="3.0.0" />
    <PackageReference Include="NLog.Web.AspNetCore" Version="4.7.0" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="3.0.0" />
    <PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="2.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="2.1.1" />
    <PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="2.1.1" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.3" />
    <PackageReference Include="Castle.Core" Version="4.3.1" />    
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.1.1" PrivateAssets="All" />
    <PackageReference Include="Abp.Dapper" Version="3.8.2" />
    <PackageReference Include="Abp.EntityFrameworkCore" Version="3.8.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.1.4" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.1.4" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.4">
    

1 Ответ

0 голосов
/ 10 декабря 2018

Я не думаю, что Entity Framework предоставляет какой-либо способ установки отложенной блокировки для обновлений, но вы можете получить это поведение, используя Database.Begin API для запуска, фиксации и отката транзакций.

Вы можете начать транзакцию при обновленииЛюбая вещь и совершить транзакцию после завершения ваших обновлений в течение этого интервала, никто не сможет обновить какие-либо данные в базе данных.

using (var context = new BloggingContext())
{
    using (var transaction = context.Database.BeginTransaction())
    {
        try
        {
            //Did your work here

            //During this time it will help as a pending lock for other updates
           transaction.Commit();
        }
        catch (Exception)
        {
            // TODO: Handle failure
        }
    }
}

Надеемся, что это покроет вашу проблему.

Обновлено

Обратите внимание, что только те запросы, которые выполняются с использованием другого экземпляра BloggingContext(), будут установлены в ожидании блокировки; это поведение не будет применяться к экземпляру BloggingContext(), который использовался для запуска транзакции.

...