提交更改时的线程并发实体框架

问题描述

我有三个线程使用一个方法数据库添加一个实体和一个存储库

这是三个连续线程使用的方法

       public async Task SaveAssets(string socketName)
        {
            var scope = _serviceScopeFactory.CreateScope();
            var securityListRepository = scope.ServiceProvider.GetService<ISecurityListRepository>();
            var uow = scope.ServiceProvider.GetService<IUnitOfWork>();

            List<AssetModel> assetsList = _socketsAssets[socketName]?.Where(asset => asset != null).ToList();

            foreach (var asset in assetsList)
            {
                asset.ServerReference = socketName;
                securityListRepository.Add(asset);
            }

            if (await uow.Commit())
            {
                _logger.Log@R_890_4045@ion("Commited");
            }
            else
            {
                _logger.LogError("Not Commited");
            }
        }

我在 EF 文档中读到:如果我对 DbContext 的并发访问有问题,那么使用 ServiceScopeFactory 为每个线程创建存储库的新范围(该类继承另一个具有 DbContext 的类) ,所以我做到了;

一个线程尝试将一堆(10k+)实体添加到存储库时,这会起作用;

但似乎当一个线程开始提交更改,而另一个线程也开始提交时,它会抛出 sqlite Error 5: 'database is locked'. entity framework

OBS:我正在使用 sqlite 数据库

这是因为一个线程开始提交更改,而另一个线程同时开始提交?

数据库被锁定是因为我使用 sqlite 还是在我进行多次提交时锁定是正常的?

OBS:存储库、UnityOfWork 和 DbContext 生命周期是有范围的。

services.AddDbContext<ApplicationDbContext>();
services.AddScoped<IUnitOfWork,UnitOfWork>();
services.AddScoped<ISecurityListRepository,SecurityListRepository>();

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)