首页 > 解决方案 > 提交更改实体框架时的线程并发

问题描述

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

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

       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.LogInformation("Commited");
            }
            else
            {
                _logger.LogError("Not Commited");
            }
        }

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

当一个线程尝试将一堆(10k+)实体添加到存储库时,此方法有效;

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

OBS:我使用 SQLite 数据库

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

数据库被锁定是因为我使用 SQLite 或者当我进行多次提交时锁定是否正常?

OBS:Repository、UnityOfWork 和 DbContext 生命周期是 Scoped 的。

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

标签: .netmultithreadingentity-frameworkconcurrencysavechanges

解决方案


推荐阅读