问题描述
这是三个连续线程使用的方法:
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
数据库被锁定是因为我使用 sqlite 还是在我进行多次提交时锁定是正常的?
OBS:存储库、UnityOfWork 和 DbContext 生命周期是有范围的。
services.AddDbContext<ApplicationDbContext>();
services.AddScoped<IUnitOfWork,UnitOfWork>();
services.AddScoped<ISecurityListRepository,SecurityListRepository>();
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)