c# Entity Framework怎么处理并发问题? 20

我开了两个线程,一个用于满足条件则添加或者修改XXX到数据库,另一个线程用于查询,只使用一个线程无问题,当两个线程一起使用,可能就会出现问题,异常为:不允许启动新事务,因... 我开了两个线程,一个用于满足条件则添加或者修改XXX到数据库,另一个线程用于查询,只使用一个线程无问题,当两个线程一起使用,可能就会出现问题,异常为:不允许启动新事务,因为有其他线程正在该会话中运行。
网上查了下,是ef的并发问题,但是照网上的方法试了下,例如添加修改加lock,并没有用。请大神们推荐一个好的解决方案,别百度照抄,谢谢,百度的大多都看过了。
展开
 我来答
makosharp
2018-06-05 · TA获得超过676个赞
知道小有建树答主
回答量:188
采纳率:100%
帮助的人:269万
展开全部
如果异常提示如你所说,首先有一点可以肯定,你在两个线程中使用了同一个dbcontext实例。
每个dbcontext背后都是一个真实的物理连接,且该context有着自己的实体追踪状态。在多个线程中使用同一个dbcontext,即使你加lock按顺序执行savechanges提交事务,也有可能因为实体状态紊乱导致其他的问题。其次,你应该知道在同一个dbconnection上的transaction未被提交或者回滚时是不允许开启新的transaction的,反映在ef,就会出现你遇到的异常。
请在各个线程中使用单独的dbcontext避免此类问题。
此外,事务是有隔离级别(transaction isolation level)的,应按照具体需求进行配置,请自己检索相关资料。
最后,无论何时都应该尽量让事务代码尽可能少以减少潜在的脏数据,事务死锁等问题的发生几率。如无必要不应该长时间跟踪实体状态(查询过早提交过晚)。为安全考虑,需要时应新起dbcontext,ef和数据库会为你在连接池中优化分配,大多数情况下开销是能够接受的。
追问
对对,你说的非常对。我的确是在多个线程中使用了同一个dbcontext,大神,你回答到点了。而且我也按照你的尝试过,没使用一次添加,修改,删除都要实例一次dncontext,但是这样会不会有个问题。应该我与数据库交互非常频繁,这样我多个线程操作数据库,实例化会不会对性能与开销造成很大的影响,我现在只是测试了短时间的运行。我1秒钟大约与数据库交互需要30次左右。
百度网友677d12e
2018-04-29 · TA获得超过2488个赞
知道小有建树答主
回答量:1806
采纳率:63%
帮助的人:309万
展开全部
你去 github 的EF开发团队 下面问问,或许你能得到一些建议
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友770eb8bca
2018-04-19 · TA获得超过240个赞
知道小有建树答主
回答量:647
采纳率:50%
帮助的人:229万
展开全部
不是的话,建立两个不同的数据库连接就行了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式