框架为.NET Core3.1,使用AddContextPool注入上下文,数据库为SQLSERVER。
调用代码为 _context.StockInfos.FromSqlRaw("exec getStockInfo") ;
可以确定程序明面上的代码中没有启动事务。执行的存储过程中只是去链接服务器中查询数据,但是有临时表增删动作。
报错信息为:Cannot start a transaction for OLE DB provider "IBMDA400" for linked server "AS400S1"
错误不定时出现,几秒到几分钟后恢复正常,程序报错期间直接操作sql调用存储过程没有问题,重新启动程序后错误也会消失。
尝试过以下操作
①改成ADO.Net直接调取,依然不定时报错;
②改成AddContext,依然不定时报错;
③将程序发布至同服务器其他端口,轮询调用,这种方式是没有报错,但需要实时获取数据,不能用这种方式。
以上都是手机一个一个码出来的,如果有不完善的,请提出。
该问题已经困扰了本人近一个月,希望大佬们能帮忙看看解决下。
改成ADO.Net直接调取,依然不定时报错;
那么显然和efcore就没什么关系了。
还是你的数据库的问题或者查询的问题。
试试这个
db.Configuration.EnsureTransactionsForFunctionsAndCommands = false;
调用的时候,暂时将它改为false,调用完成后恢复
郁闷的是为啥轮询几天都不会报错,明天我试试db.Configuration.EnsureTransactionsForFunctionsAndCommands。
实在没办法我只能判定当前只有一个请求时,StopApplication了,有知道怎么判定当前正在处理的请求数的吗?我能想到的是弄个中间件,请求进来时缓存加一,请求结束缓存减一,有更直接的方式吗?