.net - 提交更改实体框架时的线程并发
问题描述
我有三个线程使用一个在数据库中添加一个带有存储库的实体的方法
这是三个连续线程使用的方法:
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>();
解决方案
推荐阅读
- docker - 无法加载源 https://api.nuget.org/v3/index.json 的服务索引。[C:\app\aspnetapp.csproj]
- php - 如何在此查询中以 KM 为单位获取距离
- android - 如何让 Visual Studio Online 进行 Build Cordova/PhoneGap?
- file - 在 Rust 中以读写模式打开文件
- android - 从电子邮件到 Android 应用程序的 URL 深层链接不起作用
- ipv6 - ipv6 tcp 连接失败,而 ipv4 连接成功
- python - 向索引数据框熊猫添加一行
- java - CORS 过滤器在我的 Java 应用程序中不起作用
- vba - Excel VBA - 获取字符串中特定单词的行号
- python - Python 烧瓶、apache 和 mod_wsgi 应用程序不工作